malloc的GNU手册页面定义,当free()使用相同的指针(之前由malloc()分配)调用两次时,“会发生未定义的行为”。
这是什么行为?
在哪里可以找到有关此类错误的详细信息?
发布于 2012-12-04 02:48:54
“未定义的行为”仅仅意味着实现不需要以任何特定的方式处理这种情况;任何行为或结果都被认为是“正确的”。
free-ing指针不止一次的结果取决于malloc的底层实现;结果可能是崩溃和核心转储,或者它可能会破坏malloc竞技场(弄乱了未来的分配/释放),或者它可能会完全忽略double free。
发布于 2012-12-03 22:28:39
对于未定义的行为,C99标准规定了以下内容(在术语和定义部分):
可能的未定义行为范围从完全忽略具有不可预测结果的情况,到在翻译或程序执行期间以环境特有的记录方式表现(具有或不具有诊断消息),到终止翻译或执行(具有诊断消息的发布)。
总而言之:任何事情都可能发生。最坏的情况是程序按预期运行。
发布于 2012-12-03 22:31:40
您不能同时释放同一指针两次。
如果你想在没有未定义行为的情况下做这样的行为。
您可以使用下面的宏,而不是完全免费的代码
#define FREE(X) free(X); X=NULL
char *p;
p=malloc(50);
FREE(p);
FREE(p);当您强制指针为NULL时,这将避免在下一次释放中出现未定义的行为。因为free(NULL)不会导致未定义的行为。
https://stackoverflow.com/questions/13685240
复制相似问题