8

代码如下:

#include <stdlib.h>

int num = 3;   // Static external variable
int *ptr = &num;

int main(void)
{
 int num2 = 4;  // Automatic variable
 int *ptr2 = &num2;

 free(ptr);  //Free static variable
 free(ptr2); //Free automatic variable

 return 0; 
}

我尝试编译上面的代码并且它可以工作,我很好奇该free()函数是否能够同时释放静态变量和自动变量?还是基本上什么都不做?

4

2 回答 2

21

调用free()未由内存分配函数(等)返回的指针malloccalloc导致未定义行为
你的代码有一个未定义的行为,所以编译器不需要给你任何诊断,它可以显示任何行为,它可能会工作,或者崩溃,或者真的做任何事情。

避免编写导致未定义行为的代码是唯一的解决方案。

于 2012-05-23T08:16:26.490 回答
5

你不应该那样做。free仅用于由malloc函数族从堆中动态分配的内存。

内存num是在数据段中静态分配的,无法释放。内存num2在 的调用栈帧中分配,main一旦main返回就会释放。

实际发生的情况取决于free. 通常在堆中维护特定的数据结构来帮助malloc/free跟踪分配和空闲的内存区域。free期望这些数据结构位于其参数指向的位置附近。当您向它传递一个不指向已malloc分配堆区域的指针时,它会将垃圾数据视为一些有用的信息并做一些奇怪的事情。如果结果只是立即的程序崩溃,那么您很幸运。

于 2012-05-23T08:16:27.457 回答