关于在C ++代码中使用realloc实现的问题

时间:2009-03-09 13:02:03

标签: c++ memory-management realloc

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

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

/* an later */

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

现在wikipeadia(_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的指针???

非常感谢

6 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:5)

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

  • 如果你传递一个空指针,realloc就会执行malloc所做的事。
  • 如果你把它传递给零大小,那么realloc会做什么免费的。

引自Here,你有更深入的解释。

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

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

但是对于C ++来说,最好的解决方案是制作自己的mallocator,这是基于C的malloc()的标准解决方案。查看thisthis

答案 2 :(得分:1)

使用建议的方法 - 保持指向前一个缓冲区的指针,直到realloc成功返回。一旦realloc()成功返回,前一个块已经被释放,所有指向它的指针都已经悬空 - 调整它们。

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

当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 */
}

答案 5 :(得分:0)

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

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

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

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