【问题标题】:Can I free() static and automatic variables in C?我可以在 C 中释放()静态和自动变量吗?
【发布时间】:2018-11-14 22:48:18
【问题描述】:

代码如下:

#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() 函数是否能够同时释放静态变量和自动变量?还是基本上什么都不做?

【问题讨论】:

  • 对于“作品”的足够低质量定义,它“有效”。即使在相同的系统、相同的编译器或不同的编译选项上,它也可能崩溃。这只是未定义的行为——任何事情都可能发生,甚至是预期的事情。

标签: c free scope static-variables dynamic-allocation


【解决方案1】:

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

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

【讨论】:

  • 您也可以在 NULL 指针上调用 free(),因为这是已定义的行为。只要确保你永远不会在 same 指针上调用 free() 两次。
  • @caramel23:你所能得到的保证是一个未定义的行为。
【解决方案2】:

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

num 的内存在数据段中静态分配,无法释放。 num2 的内存在main 的调用堆栈帧中分配,并在main 返回后立即释放。

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

【讨论】:

    猜你喜欢
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 2011-07-30
    • 2011-02-15
    • 1970-01-01
    相关资源
    最近更新 更多