我知道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
本身包含分配的内存等等
感谢您的推荐......
答案 0 :(得分:6)
malloc
,realloc
和free
不知道内存的用途。如果您正在使用内存来存储指向其他动态分配内存的指针,那么您可以整理一下!
另请注意,您在代码段中使用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;
...
}