2

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

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

4

5 回答 5

7

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

可能的未定义行为范围从完全忽略具有不可预测结果的情况,到在翻译或程序执行期间以环境特征的记录方式表现(有或没有发出诊断消息),到终止翻译或执行(有发出的诊断消息)。

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

于 2012-12-03T14:28:39.033 回答
2

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

free多次 -ing 指针的结果取决于 ; 的底层实现malloc。结果可能是崩溃和核心转储,或者它可能破坏malloc竞技场(弄脏未来的分配/解除分配),或者它可能free完全忽略双重。

于 2012-12-03T18:48:53.680 回答
1

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

如果您想在没有未定义行为的情况下执行此类行为。

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

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


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

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

于 2012-12-03T14:31:40.417 回答
0

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

尝试分析未定义行为的特定实例时,您不会获得任何洞察力。补救方法是不要调用free()两次。

于 2012-12-03T14:26:37.910 回答
0

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

于 2012-12-03T14:46:51.560 回答