【问题标题】:What REALLY happens when I free() before malloc?(I know something will go wrong but WHAT?) [duplicate]当我在 malloc 之前 free() 时真正发生了什么?(我知道会出问题但是什么?) [重复]
【发布时间】:2014-06-04 12:59:23
【问题描述】:

我问上述奇怪的问题只是为了提高我对动态内存分配的理解。

除了上述问题,我在 codepad.org 上运行以下代码 sn-p。

void main()
{
   static int a = 10;
   int* b = &a;
   free(b);
}

我在输出窗口上收到“分段错误”消息。这是什么?可能是我正在通过 free() 访问受限内存?

此外,如果 a 不初始化 'a',则输出窗口上不会显示任何内容。 请帮助我理解这种行为。

【问题讨论】:

  • 你的目标是什么?您希望会发生什么?
  • 被称为“未定义行为”。
  • 为什么投反对票?我搜索了很多尝试各种组合,链接的问题没有弹出。问的问题是错误的吗?为什么要通过投反对票来劝阻人们?是我的错,我不能想出上一题的单词组合?

标签: c


【解决方案1】:

您会得到未定义的行为,因为您传递了一个指向 free() 的指针,而该指针不是由 malloc()(或其同级堆分配函数之一,如 realloc() & co)获取的。

当然free() 无法知道这一点,并且避免将指针视为有效。因此,它将假设它可以找到与指针关联的任何簿记数据,无论您的特定内存分配器实现者选择何种方式。

请注意,free() 没有什么“魔法”,它只是一个函数。特别是,它无法访问比传入的信息更多的信息,即单个指针。

【讨论】:

    猜你喜欢
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 2021-02-08
    • 2015-08-06
    • 1970-01-01
    相关资源
    最近更新 更多