malloc双重自由行为

时间:2012-12-03 14:24:44

标签: c linux unix malloc gnu

malloc的GNU手册页定义当free()使用相同的指针(之前由malloc()分配)调用两次时,“未定义的行为发生”。

这是什么行为?
我在哪里可以找到有关此类错误的更多信息?

5 个答案:

答案 0 :(得分:6)

C99标准规定了以下未定义行为(在术语和定义部分下):

  

可能的未定义行为包括完全忽略具有不可预测结果的情况,在转换或程序执行期间以环境特征(有或没有发出诊断消息)的文档方式执行,终止翻译或执行(发布诊断信息)。

总结:任何事情都可能发生。最糟糕的情况是程序按预期运行。

答案 1 :(得分:1)

你不能同时释放两次相同的指针。

如果你想在没有未定义行为的情况下做这样的行为。

您可以使用以下宏而不是全部免费代码

#define FREE(X) free(X); X=NULL


char *p;
p=malloc(50);
FREE(p);
FREE(p);

当您强制指针为NULL时,这将避免下一个空闲时未定义的行为。因为free(NULL)不会导致未定义的行为。

答案 2 :(得分:1)

“未定义的行为”通常意味着您的程序将崩溃。对于c库的实现者来说,这意味着他们可以根据需要处理这种情况。例如,他们可以免费忽略你的第二个无效免费。几乎没有c库会这样做。大多数c库只会因某种内存违规错误而中止您的程序。

答案 3 :(得分:1)

“未定义的行为”仅仅意味着不需要实现以任何特定方式处理该情况; 任何行为或结果都被视为“正确”。

free多次使用指针的结果取决于malloc的基础实现;结果可能是崩溃和核心转储,或者它可能破坏malloc竞技场(污染未来的分配/解除分配),或者它可能完全忽略双free

答案 4 :(得分:0)

未定义的行为意味着任何事情都可能发生。其中一个可能的结果是您的程序运行完美。另一个可能的结果是你的程序崩溃了。或者你能想到的任何其他事情。

尝试分析未定义行为的特定实例时,您将无法获得任何洞察力。补救措施不是两次致电free()