GNU 手册页malloc
定义了当free()
使用相同的指针(先前由 分配的malloc()
)调用两次时“发生未定义的行为”。
那是一种什么样的行为?
在哪里可以找到有关此类错误的更多信息?
C99 标准针对未定义的行为规定了以下内容(在术语和定义部分下):
可能的未定义行为范围从完全忽略具有不可预测结果的情况,到在翻译或程序执行期间以环境特征的记录方式表现(有或没有发出诊断消息),到终止翻译或执行(有发出的诊断消息)。
总结:任何事情都有可能发生。最坏的情况是程序按预期运行。
“未定义的行为”仅仅意味着实现不需要以任何特定的方式处理这种情况;任何行为或结果都被认为是“正确的”。
free
多次 -ing 指针的结果取决于 ; 的底层实现malloc
。结果可能是崩溃和核心转储,或者它可能破坏malloc
竞技场(弄脏未来的分配/解除分配),或者它可能free
完全忽略双重。
您不能同时释放两次相同的指针。
如果您想在没有未定义行为的情况下执行此类行为。
您可以使用以下宏而不是全部免费的代码
#define FREE(X) free(X); X=NULL
char *p;
p=malloc(50);
FREE(p);
FREE(p);
当您强制指针为 时NULL
,这将避免下一次释放中未定义的行为。因为free(NULL)
不会导致未定义的行为。
未定义的行为意味着任何事情都可能发生。可能的结果之一是您的程序运行良好。另一个可能的结果是您的程序崩溃。或者你能想到的任何其他东西。
尝试分析未定义行为的特定实例时,您不会获得任何洞察力。补救方法是不要调用free()
两次。
“未定义的行为”通常意味着您的程序将崩溃。对于 c 库的实现者来说,这意味着他们可以随心所欲地处理这种情况。例如,他们可以免费忽略您的第二次无效免费。几乎没有 c 库会这样做。大多数 c 库只会因某种内存冲突错误而中止您的程序。