malloc
的GNU手册页定义,当free()
用同一个指针调用两次(以前由malloc()
分配)时,会发生“未定义的行为”。
那是什么样的行为?
我在哪里可以find更多有关这种错误的信息?
“未定义的行为”仅仅意味着实施不需要以任何特定的方式来处理这种情况; 任何行为或结果都被视为“正确”。
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()
两次。