C:释放重新分配的指针

时间:2012-05-08 20:28:39

标签: c pointers free realloc

我今天发现,当我尝试free一个已经重新分配的指针时,程序崩溃并打印出“Segmentation Fault”。

在此指针(数组)上调用realloc(),以便对数组进行大小调整并合并旧数组和另一个数组。

此外,在程序中我必须free它,如何在不必制作某种缓冲区数组的情况下绕过这个问题,将其他2个数组添加到它然后释放它们?

  1. PARTICLE:结构
  2. newCount:正在添加的旧数组+数组大小的总和
  3. 代码:

    group1->particleList = 
             (PARTICLE *) realloc(group1->particleList, newCount * sizeof(PARTICLE));
    

3 个答案:

答案 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)。