0

我知道这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...
}

显然以上只是一个片段,但一个片段却描绘了一千个单词。

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

可以通过在调用释放(现在为 NULL)指针之前合并int number_elements_new到代码中并循环free剩余的 s来规避泄漏。myStructrealloc

如果realloc做驴工作并释放所有相关的内存,那就太好了,否则我必须仔细检查以确保没有遗漏任何东西——myStruct它本身包含分配的内存等等。

谢谢你的建议...

4

3 回答 3

6

mallocrealloc并且free不知道内存的用途。如果您使用内存来存储指向其他动态分配内存的指针,那么您需要整理一下!


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

于 2013-01-25T14:25:23.513 回答
0

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

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

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

于 2013-01-25T14:30:18.347 回答
0

如果要缩小数组的大小,则首先需要free每个myStructArray[i] where i>= num_elements,否则会出现内存泄漏。

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

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

myStruct **tmp = realloc(myStructArray, ...);
if (tmp)
{
  myStructArray = tmp;
  ...
}
于 2013-01-25T14:33:11.767 回答