【发布时间】:2017-01-11 09:05:08
【问题描述】:
我和我的朋友就释放动态分配的内存进行了讨论。他告诉我可以用 realloc() 来释放内存,但我拒绝了。 让我们考虑下面的代码:
int main()
{
int *p = (int *)malloc(sizeof(int) * 10);
int *q = (int *)malloc(sizeof(int) * 10);
free(p);
p = NULL;
realloc(q, sizeof(int) * 0);
q = NULL;
_getch();
return 0;
}
假设 p 和 q 分别指向地址 0x1000 和 0x2000。
在上面的代码中,p 和 q 是int 指针,指向 RAM 中动态分配的 40 字节内存块。在执行 free(p) 时释放内存地址 (0x1000)。释放的内存地址 (0x1000) 可以再次被操作系统使用。然后,将 NULL 分配给指针变量p,以防止p 成为悬空指针。
realloc(q, sizeof(int) * 0);
realloc() 只是将 q 指向的内存块缩小为零。但是 q 仍然指向同一个地址 (0x2000),并且该地址没有被释放。在将 NULL 值分配给指针 q 时,q 现在指向 NULL,并且未释放 q 指向的地址 (0x2000)并且该地址 (0x2000) 的链接丢失。该地址 (0x2000) 在程序结束之前不能被操作系统使用。
我的理解正确吗?
【问题讨论】:
-
你有什么证据表明q指向的东西没有被释放?
-
即使
realloc()的第二个参数为0,内存分配函数使用的堆中数据结构中的条目也不会被释放(不会返回到可用内存池) ,按设计使用的功能使用它们。 -
是的,您的理解是正确的,但有一点需要注意。通常当内存分配收缩时,实际保留的内存不会收缩
-
"realloc() 只是将 q 指向的内存块缩小到零。" --> 也许,也许不是。 C 没有指定
realloc()必须 以这种方式运行。这是一种多种可能性。
标签: c heap-memory