我今天发现,当我尝试free
一个已经重新分配的指针时,程序崩溃并打印出“Segmentation Fault”。
在此指针(数组)上调用realloc()
,以便对数组进行大小调整并合并旧数组和另一个数组。
此外,在程序中我必须free
它,如何在不必制作某种缓冲区数组的情况下绕过这个问题,将其他2个数组添加到它然后释放它们?
PARTICLE
:结构newCount
:正在添加的旧数组+数组大小的总和代码:
group1->particleList =
(PARTICLE *) realloc(group1->particleList, newCount * sizeof(PARTICLE));
答案 0 :(得分:2)
释放重新分配的指针应该没有问题。一个名为valgrind的程序可以为您提供有关代码中发生的事情的一些有价值的信息。
答案 1 :(得分:1)
您是否包含“stdlib.h”?
投放realloc
和朋友的回归可以隐藏没有原型的问题。然后,较旧的编译器将其返回int
,将int
强制转换为指针类型并完成损坏。
realloc
会像其他人提到的那样返回0
的问题,当你free
缓冲区时,不应该导致错误,而是更早。
答案 2 :(得分:0)
首先,确保将realloc
的结果分配给临时变量;如果请求失败,realloc
将返回NULL,并且您将丢失已经分配的内存的句柄:
PARTICLE *tmp = realloc(group1->particleList, ...); // cast is unnecessary
if (tmp)
group1->particlelist = tmp;
else
/* handle realloc failure */
确保在group1->particleList
来电之前,您不会意外覆盖free
(可能在您的合并代码中?)。即使在realloc
调用失败的情况下它被NULL覆盖,free
应该能够处理NULL参数(基本上,它是一个否-OP)。