【发布时间】:2016-05-29 11:29:33
【问题描述】:
来自 cplusplus.com:
先前通过调用 malloc、calloc 或 realloc 分配的内存块被释放,使其再次可用于进一步分配。
如果 ptr 没有指向使用上述函数分配的内存块,则会导致未定义的行为。
如果 ptr 是空指针,则函数什么也不做。
请注意,此函数不会更改 ptr 本身的值,因此它仍然指向相同(现在无效)的位置。
但是如果我的指针没有指向块的开头会发生什么。
例如:
int *ptr = malloc(sizeof(int)*10);
ptr++;
free(ptr);
free 是否只释放最后 9 个位置?在这种情况下,这将是可怕的,那么:
int *ptr = malloc(sizeof(int)*10);
int i;
for(i=0; i<10; i++, ptr++);
free(ptr);
这里 ptr 指向 malloc 保留的内存块之外。
这会是什么行为?
int *ptr1 = malloc(sizeof(int)*10);
int *ptr2 = ptr1 + 2;
free(ptr2);
谢谢。
【问题讨论】:
-
free 必须完全匹配 malloc,或者 UB
-
您只能将
malloc或realloc或calloc返回的确切指针传递给free。您无法将修改后的指针传递给free,而不会遇到未定义的行为。 -
答案直接在您粘贴的内容中:如果 ptr 未指向分配有上述函数的内存块,则会导致未定义的行为。 指向除start 与不指向块相同。
-
当你说我必须传递 malloc 系列返回的确切指针时,你是指变量本身还是内存方向?这会合法吗? int *ptr1 = malloc(sizeof(int)*10); int *ptr2 = ptr1;免费(ptr2);
-
@jumer
malloc()返回的 value 是必须提供给free()的值。您如何管理该值的存储取决于您的需要,但在您的简单示例中,未修改的变量就足够了。
标签: c pointers memory-management malloc free