C中与free()相关的查询

C中与free()相关的查询,c,free,C,Free,如果试图释放未使用malloc/calloc分配的内存,会发生什么情况 我的意思是: void main() { int temp = 0; int *ptr = &temp; free(ptr); } 我以为free()会返回一些错误代码,但是free()没有返回值。如果对以前未分配的指针调用free(),它将触发未定义的行为 发件人: free()函数释放ptr指向的内存空间,该内存空间必须由以前对malloc()、calloc()或realloc()的调用返回。否则,或者如果之前

如果试图释放未使用
malloc/calloc
分配的内存,会发生什么情况

我的意思是:

void main()
{
int temp = 0;
int *ptr = &temp;
free(ptr);
}
我以为
free()
会返回一些错误代码,但是
free()
没有返回值。

如果对以前未分配的指针调用
free()
,它将触发未定义的行为

发件人:

free()函数释放ptr指向的内存空间,该内存空间必须由以前对malloc()、calloc()或realloc()的调用返回。否则,或者如果之前已经调用了free(ptr),则会发生未定义的行为。如果ptr为NULL,则不执行任何操作


我稍微扩展了上面的代码:

#include <stdio.h>
#include <stdlib.h>

void main()
{
  int temp = 0;
  int *ptr = &temp;
  printf("Before: %0X\n", ptr);
  free(ptr);
  printf("After: %0X\n", ptr);
  getchar();
}
使用MinGW-GCC编译时,生成的exe运行时不会出错(“After:…”行显示的ptr值与“Before:…”行相同)

添加到:这是ISO/IEC 9899:1999,7.20.3.2中未定义的行为:

否则,如果参数与 callocmallocrealloc函数[…]行为未定义


请参见此处的标准草案:.

除了Malcom和undur_gongor的答案外,Windows上的C与Visual Studio相同。MSDN说明中的相关章节如下:

free函数释放以前通过调用calloc、malloc或realloc分配的内存块(memblock)。释放的字节数等于分配块时请求的字节数(如果是realloc,则为重新分配)。如果memblock为NULL,指针将被忽略并立即返回free。尝试释放无效指针(指向未由calloc、malloc或realloc分配的内存块的指针)可能会影响后续分配请求并导致错误


所有的地狱都会爆发

这意味着:

  • 如果幸运的话,您的程序将出错并终止
  • 如果您运气不好,某些攻击者会使用您的程序执行任意代码(
    free()
    通常会尝试将新释放的内存“块”插入到某些数据结构中,这通常涉及在由您传递的指针处/附近的值确定的位置进行写入)
  • 介于这两个极端之间的任何东西。错误终止比错误终止更糟糕
您希望C语言能像Python或Java一样慢。如果这是你想要的,使用其中一种语言。否则,服用红色药丸,潜入一个奇妙的世界,在那里你实际上必须为履行你所使用的接口合同而承担责任。“试着想象你所知道的所有生命瞬间停止,你体内的每一个分子都以光速爆炸。”()@R.:我只是问了一个问题。我不是在抱怨C。也许你可以看看,或者你可以在很多网页上读到这句话,但是有没有什么“官方证据”可以证明这一点呢?@kol:有关权威参考,请参阅我的答案()。
/*
 * If this ASSERT fails, a bad pointer has been passed in. It may be
 * totally bogus, or it may have been allocated from another heap.
 * The pointer MUST come from the 'local' heap.
 */
_ASSERTE(_CrtIsValidHeapPointer(pUserData));