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中未定义的行为:
否则,如果参数与
calloc、malloc或realloc函数[…]行为未定义
请参见此处的标准草案:.除了Malcom和undur_gongor的答案外,Windows上的C与Visual Studio相同。MSDN说明中的相关章节如下: free函数释放以前通过调用calloc、malloc或realloc分配的内存块(memblock)。释放的字节数等于分配块时请求的字节数(如果是realloc,则为重新分配)。如果memblock为NULL,指针将被忽略并立即返回free。尝试释放无效指针(指向未由calloc、malloc或realloc分配的内存块的指针)可能会影响后续分配请求并导致错误
所有的地狱都会爆发 这意味着:
- 如果幸运的话,您的程序将出错并终止
- 如果您运气不好,某些攻击者会使用您的程序执行任意代码(
通常会尝试将新释放的内存“块”插入到某些数据结构中,这通常涉及在由您传递的指针处/附近的值确定的位置进行写入)free()
- 介于这两个极端之间的任何东西。错误终止比错误终止更糟糕李>
/*
* 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));