在静态/动态库混合中链接Debug-CRT时会崩溃吗?

时间:2013-04-11 09:27:23

标签: c++ visual-studio-2010 debugging crt visual-studio-6

我有一个奇怪的问题,我在代码中删除对象时遇到崩溃。对象有效,没有可能覆盖它们的内存泄漏,只有在调试模式下才会发生。使用Linux编译的相同代码在调试和发布版本中都可以正常工作。所以我猜这是Visual Studio debug-CRTs的一个奇怪问题。

我的软件结构如下:

两个静态库以“多线程(调试)DLL”模式编译,并链接到: 以“多线程(调试)”模式编译的共享库(DLL)。从逻辑上我会说它应该是相反的,但后来我得到了大量未解决的符号。

最后,有一个可执行文件以“多线程(调试)DLL”模式编译,该模式调用上面提到的DLL。当我切换到“多线程(调试)”时,它没有什么区别。

对象删除崩溃发生在dbgheap.c / _heap_alloc_dbg_impl() - > mlock.c / _unlock() -

的函数

那么:可能是什么问题?它在调试模式下是否真的有些CRT不兼容或者其他原因是什么?我很确定它不是典型的内存泄漏,因为它可以在Linux和发布版本中顺利运行。

1 个答案:

答案 0 :(得分:1)

当您静态链接库时,必须注意使用相同的 CRT“风格”。

使用DLL时:

  • 如果他们公开 pure-C接口(例如,边界没有STL类),则确保内存分配和解除分配都是在库代码中完成(或者更一般地,both client and library use the same allocator

  • 或者如果它们是 COM DLL

然后您可以使用使用不同风格 CRT构建的可执行文件来使用它们,甚至可以使用VC ++编译器的不同版本构建它们。

但是如果你的DLL在边界上有C ++类(比如STL类),那么对静态链接库有很大的限制,即你必须使用相同的 CRT风格(调试或发布)动态链接DLL和EXE,EXE和DLL都必须使用相同的编译器和相同的设置(如_HAS_ITERATOR_DEBUGGING)构建。