友
在我们的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的指针???
非常感谢
答案 0 :(得分:7)
当然,您必须防止realloc()
返回NULL
的情况。这是一个内存分配,并且在C(其中realloc()
)主要使用,我认为C ++程序员认为使用原始realloc()
调用它有点低级/ qaint,内存分配总是会失败
直接用返回值覆盖指针是一个错误,因为它会丢弃原始指针并在重新分配失败时使内存泄漏。
答案 1 :(得分:5)
Malloc()和realloc()是C函数。实际上,realloc()根据您传递的参数执行malloc()和free():
引自Here,你有更深入的解释。
C库使得无法扩展内存块,因此C ++也不支持它。
如果你想坚持C函数,那么你应该在调用realloc()时保持第一个内存分配的指针。然后检查它是否为NULL,否则就像在latst代码中那样分配它。
但是对于C ++来说,最好的解决方案是制作自己的mallocator,这是基于C的malloc()的标准解决方案。查看this或this。
答案 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的指针。