dlmalloc + CPP + strdup + Mac OS X =崩溃

时间:2010-01-05 18:58:07

标签: c++ macos

我在混合的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上解决此问题?

1 个答案:

答案 0 :(得分:0)

我想我已经弄清楚发生了什么。它与Mac OS X强制您使用动态libc的方式有关。 dlmalloc静态编译到exe中。但是正常的malloc正在动态libc中使用。当你调用strdup时,它使用常规malloc,但是当调用free时它使用dlmalloc。吊杆。