realloc和mallocs的幽灵过去了

时间:2013-01-25 14:22:08

标签: c free realloc

我知道realloc会在必要时释放记忆,而且我知道C的第三条规则 - “对于每个malloc,必须有一个相等且相反的free”......但这两者如何协同工作?

情况最好用代码描述:

int main()
{
    myStruct **myStructArray;
    int      i, num_elements;

    num_elements = getnumber(); // gets value for num_elements

    myStructArray = (myStruct **) malloc(num_elements * sizeof(myStruct*));
    for (i=0; i<num_elements; i++)
        myStructArray[i] = (myStruct *) malloc(sizeof(myStruct));

    // so far so good...

    num_elements = getnumber(); // gets new, LOWER value

    myStructArray = realloc(myStructArrary, num_elements * sizeof(myStruct*));

    // rest_of_code, and necessary free loop for myStructArray etc...
}

显然,上面只不过是一个片段,但是一个片段描绘了千言万语。

这会造成内存泄漏吗?我知道对realloc的调用将释放指针的内存,但是我可以看到支持和反对可能会遗忘一堆内存的可能性。

通过将int number_elements_new合并到代码中并在调用free之前循环myStruct来释放(现在为NULL)指针,可以避免泄漏

如果realloc做了驴工作并释放了所有相关的内存,那么我就必须通过拖网来确保没有遗漏任何内容 - realloc本身包含分配的内存等等

感谢您的推荐......

3 个答案:

答案 0 :(得分:6)

mallocreallocfree不知道内存的用途。如果您正在使用内存来存储指向其他动态分配内存的指针,那么您可以整理一下!


另请注意,您在代码段中使用realloc的方式可能不安全。如果realloc失败,则会使原始内存未释放,并返回NULL。最佳做法是将返回值分配给临时指针,然后检查。参见例如http://www.c-faq.com/malloc/realloc.html

答案 1 :(得分:0)

如果该数字低于现有元素数,则会引入内存泄漏,因为重新分配的块与内容无关,并且您将丢失对for循环中分配的块的引用。

因此,您必须循环遍历数组并释放所有要删除的元素。

如果数字高于现有数字,则不会产生内存泄漏,因为如果已分配新内存块,则realloc会复制现有数据。因此,调整大小的数组仍会引用其他动态分配的块(for循环中的malloc)。这里唯一的问题是,新分配的数组空间是未初始化的,因此可能包含无效指针。

答案 2 :(得分:0)

如果缩小数组的大小,首先需要free每个myStructArray[i] i&gt; = num_elements,否则你将拥有内存泄漏。

换句话说,缩小指针数组的大小不会影响每个数组元素指向的内存。

此外,在realloc调用中,您需要将结果分配给临时指针;如果realloc无法扩展或缩小缓冲区,它将返回NULL,并且您将丢失对该块的引用,这也会引入泄漏:

myStruct **tmp = realloc(myStructArray, ...);
if (tmp)
{
  myStructArray = tmp;
  ...
}