朋友们

在我们的 C++ 中,我当前使用 realloc 方法来调整 malloc 分配的内存大小。realloc() 的用法如下

my_Struct *strPtr =(my_struct*)malloc(sizeof(my_Struct));

/* an later */

strPtr = (my_struct*)realloc(strPtr,sizeof(my_Struct)*NBR);

现在维基百科(_http://en.wikipedia.org/wiki/Malloc)说

如果有人这样做

void *p = malloc(orig_size);

/* and later... */

p = realloc(p, big_size);

然后,如果无法获得 big_size 字节的内存,p 将具有 NULL 值,并且我们不再有指向先前为 p 分配的内存的指针,从而造成内存泄漏

它还说纠正上述错误的正确方法是

void *p = malloc(orig_size);

/* and later... */

void *tmp = realloc(p, big_size); 

if (tmp != NULL)
 {

p = tmp; /* OK, assign new, larger storage to p */

} 

else 

{

/* handle the problem somehow */

}

你能告诉我哪种是使用 realloc() 的最佳方法吗

另外,一旦我有了指向结构的指针,然后在稍后使用 realloc 时,我可以使用指向 void 的指针吗???

非常感谢

有帮助吗?

解决方案

当然,您必须防止realloc()返回NULL的情况。它是一个内存分配,并且在C(其中<=>)主要使用,我认为C ++程序员认为使用原始<=>调用它有点低级/ qaint,内存分配总是会失败。

直接用返回值覆盖指针是一个错误,因为它会丢弃原始指针并在重新分配失败时使内存泄漏。

其他提示

Malloc() 和 realloc() 是 C 函数。实际上,realloc() 根据您传递的参数执行 malloc() 和 free() 操作:

  • 如果你向它传递一个空指针,realloc 就会执行 malloc 的操作。
  • 如果传递零大小,则 realloc 会执行 free 的操作。

引自 这里, ,在那里你有更深入的解释。

C 库使得无法就地扩展内存块,因此 C++ 也不支持它。

如果你想坚持使用 C 函数,那么你应该在调用 realloc() 时保存第一个内存分配的指针。然后检查它是否为 NULL,否则分配它,就像在上一个代码中所做的那样。

但也许对于 C++ 来说,最好的解决方案是创建自己的 mallocator,这是基于 C 的 malloc() 的标准解决方案。查看 , , 或者 .

使用建议的方法<!>#8211;保持指向前一个缓冲区的指针,直到realloc成功返回。一旦realloc()成功返回,前一个块就被释放,所有指向它的指针都变成了悬空<!>#8211;调整它们。

realloc以及malloc不关心什么是指针类型 - 你可以使用void *以及任何*。

正如其他人所说,只需按照建议正确使用realloc。

但是<!>“C ++方式<!>”;这样做真的是使用std :: vector <!> lt; <!> gt;而不是自己维护阵列。这样,C ++标准库将处理重新分配的低级细节(可能是通过使用realloc())。

当realloc()失败并返回NULL时,原始内存不受影响 所以你应该像这样使用它:

my_Struct* strPtr =(my_struct*)malloc(sizeof(my_Struct));

/* an later */

my_Struct* tmp = (my_struct*)realloc(strPtr,sizeof(my_Struct)*NBR);
if (tmp != NULL)
{
    strPtr = tmp;
}
else
{
    /* realloc Failed. Need to do something */
}

为什么使用malloc和realloc?在C ++中几乎总有一种更好的方法。

如果您正在使用它来制作可变长度数组,那么使用std :: vector <!> lt; <!> gt;或者其他容器模板之一几乎肯定会更好。

如果您正在使用C,可能使用支持C ++的编译器,那么正确的方法是第二种方法,它在分配失败时不会丢失整个内存块。

第二个问题的答案还取决于您使用的是C还是C ++。在C中,void *是通用数据指针类型,可以自由转换。在C ++中,需要显式转换void *。如果您实际上正在编写C,则需要使用malloc()和使用void *的朋友。如果你真的在编写C ++,你需要进行强制转换,这会让它变得更加尴尬。在两种情况下,realloc()都不能处理指向struct的指针,而是指向void的指针。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top