我的朋友和我讨论过释放动态分配的内存 . 他告诉我可以使用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
)可以再次由OS使用 . 然后, NULL 被分配给指针变量 p
,以防止 p
成为悬空指针 .
realloc(q, sizeof(int) * 0);
realloc()
只是将 q 指向的内存块缩小为零 . 但 q 仍指向同一地址( 0x2000
),并且该地址未被释放 . 在为指针 q 分配NULL值时, q 现在指向NULL并且 q 指向的地址( 0x2000
)未被释放,并且到该地址的链接( 0x2000
)将丢失 . 操作系统将来不能使用该地址( 0x2000
),直到程序结束 .
我的理解是否正确?
2 回答
realloc(, 0)
是implementation dependent and not equivalent到free()
.那就是说,你可能很幸运:
所以第二个malloc,在realloc(,0)之后,"sees"之前是一个空闲块 . 我认为这意味着 in this instance ,
realloc
重复了free
的行为 . DO NOT RELY ON THIS .和...一样
7.22.3.5中的C标准 - > 2 realloc函数说:
但它没有明确说明如果新大小为零会发生什么 . 但是你仍然有一个
artist
指针可以传递给free
.考虑
VS
output
Conclusions
deallocation
和freeing
并不完全相同 .realloc
和free
都可以解除分配内存,但只有free
可以释放内存 .那就是说
是释放内存的推荐方法 . 请检查[ this ]回答 .