我在混合的C / C ++环境中使用Mac OS X上的dlmalloc库。
以下简单代码
/// strdup-test.cpp
///
#include <iostream>
#include <string>
int main(int argc, char **argv) {
std::string s1("foo");
char *c1=strdup(s1.c_str());
std::cerr << c1 << std::endl;
// segfault?
free(c1);
return 0;
}
像这样编译
gcc -c malloc.c
g++ strdup-test.cpp -o strdup-test malloc.o
会像这样崩溃
$ ./strdup-test
foo
Segmentation fault
但Mac OS X上只有 。如果我在Ubuntu或Windows(Cygwin)中尝试相同的代码,则不会发生。
这里发生了什么?如果我直接使用malloc而不是strdup它不会崩溃。我的猜测是默认的malloc和dlmalloc是混合的。可能是因为strdup使用默认的malloc,而免费调用使用dlmalloc是免费的。如果是这样,为什么不在其他平台上发生这种情况?我如何在Mac OS X上解决此问题?
答案 0 :(得分:0)
我想我已经弄清楚发生了什么。它与Mac OS X强制您使用动态libc的方式有关。 dlmalloc静态编译到exe中。但是正常的malloc正在动态libc中使用。当你调用strdup时,它使用常规malloc,但是当调用free时它使用dlmalloc。吊杆。