微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

malloc双重自由行为

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

那是什么样的行为?

我在哪里可以find更多有关这种错误的信息?

为什么微软不像C ++那样提供像windows.h这样的最原生的函数和结构的静态Win32类?

文件locking与信号量

UWP – 更改后退button颜色,而不更改最小化/closuresbutton颜色

安全地使用临时文件

创build自定义语音命令(GNU / Linux)

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

free一个指针不止一次的结果取决于malloc的底层实现。 结果可能是崩溃和核心转储,或者它可能会破坏malloc竞技场(污染未来的分配/释放),或者它可以完全忽略double free 。

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

可能的未定义的行为范围包括从完全忽略情况和不可预测的结果,到在翻译或程序执行过程中以环境特征(有或没有发出诊断消息),终止翻译或执行(在发行的诊断消息)。

总之: 任何事情都可能发生 。 最坏的情况是程序按预期行事。

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

如果你想做一个这样的行为没有未定义的行为。

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

#define FREE(X) free(X); X=NULL char *p; p=malloc(50); FREE(p); FREE(p);

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐