【发布时间】:2011-01-18 16:48:06
【问题描述】:
我正在尝试将应用程序从 Linux 移植到 Mac Os X (leopard),但是当我执行它时,我收到以下错误消息:malloc: *** error for object 0x100160 : double free。
我已经用下面的代码重现了这个问题:
//main.cpp
#include <stdio.h>
#include <wchar.h>
int main(int argc, char*argv[])
{
wchar_t *b=NULL;
printf("a=%ls, b=%ls \n", L"a", b);
}
用 gcc 编译:
gcc main.cpp -o test
执行的输出:
a=a, b=(null)
test (5337) malloc: *** error for object 0x100160 : double free
*** set a breakpoint in malloc_error_break to debug
这很奇怪,因为如果我使用这一行:printf("a=%ls, b=%ls", b, b),则不会打印任何错误。
此外,我不能使用wprintf(L"a=%ls, b=%ls", a, b)。
在 Fedora 13 上,此程序不会打印任何错误。
这是一个 printf 错误吗? 如何消除此错误?
【问题讨论】:
-
等等,你问为什么在将 NULL 指针传递给通常期望它指向数据的函数时会遇到问题?
-
除了 CRT 库中的错误之外,我无法得到有关此行为的任何解释。
-
@Al:您是否建议 printf 可以优雅地处理空指针?我认为您正在寻找的解释是“未定义的行为是未定义的。”
-
@Jefromi:正如我在下面的评论中所说,我认为 printf 应该选择一种不同的方式来拒绝无效输入,而不是破坏或破坏内存堆。只是我个人的看法。