我有一个奇怪的问题,我在代码中删除对象时遇到崩溃。对象有效,没有可能覆盖它们的内存泄漏,只有在调试模式下才会发生。使用Linux编译的相同代码在调试和发布版本中都可以正常工作。所以我猜这是Visual Studio debug-CRTs的一个奇怪问题。
我的软件结构如下:
两个静态库以“多线程(调试)DLL”模式编译,并链接到: 以“多线程(调试)”模式编译的共享库(DLL)。从逻辑上我会说它应该是相反的,但后来我得到了大量未解决的符号。
最后,有一个可执行文件以“多线程(调试)DLL”模式编译,该模式调用上面提到的DLL。当我切换到“多线程(调试)”时,它没有什么区别。
对象删除崩溃发生在dbgheap.c / _heap_alloc_dbg_impl() - > mlock.c / _unlock() -
的函数那么:可能是什么问题?它在调试模式下是否真的有些CRT不兼容或者其他原因是什么?我很确定它不是典型的内存泄漏,因为它可以在Linux和发布版本中顺利运行。
答案 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
)构建。