malloc
的GNU手册页定义当free()
使用相同的指针(之前由malloc()
分配)调用两次时,“未定义的行为发生”。
这是什么行为?
我在哪里可以找到有关此类错误的更多信息?
答案 0 :(得分:6)
C99标准规定了以下未定义行为(在术语和定义部分下):
可能的未定义行为包括完全忽略具有不可预测结果的情况,在转换或程序执行期间以环境特征(有或没有发出诊断消息)的文档方式执行,终止翻译或执行(发布诊断信息)。
总结:任何事情都可能发生。最糟糕的情况是程序按预期运行。
答案 1 :(得分:1)
你不能同时释放两次相同的指针。
如果你想在没有未定义行为的情况下做这样的行为。
您可以使用以下宏而不是全部免费代码
#define FREE(X) free(X); X=NULL
char *p;
p=malloc(50);
FREE(p);
FREE(p);
当您强制指针为NULL
时,这将避免下一个空闲时未定义的行为。因为free(NULL)
不会导致未定义的行为。
答案 2 :(得分:1)
“未定义的行为”通常意味着您的程序将崩溃。对于c库的实现者来说,这意味着他们可以根据需要处理这种情况。例如,他们可以免费忽略你的第二个无效免费。几乎没有c库会这样做。大多数c库只会因某种内存违规错误而中止您的程序。
答案 3 :(得分:1)
“未定义的行为”仅仅意味着不需要实现以任何特定方式处理该情况; 任何行为或结果都被视为“正确”。
free
多次使用指针的结果取决于malloc
的基础实现;结果可能是崩溃和核心转储,或者它可能破坏malloc
竞技场(污染未来的分配/解除分配),或者它可能完全忽略双free
。
答案 4 :(得分:0)
未定义的行为意味着任何事情都可能发生。其中一个可能的结果是您的程序运行完美。另一个可能的结果是你的程序崩溃了。或者你能想到的任何其他事情。
尝试分析未定义行为的特定实例时,您将无法获得任何洞察力。补救措施不是两次致电free()
。