我有一个奇怪的问题,即删除代码中的对象时会崩溃。对象是有效的,没有内存泄漏可以覆盖它们,并且仅在 Debug模式下会发生。用Linux编译的相同代码在调试和发行版本中都可以正常工作。因此,我猜想这是Visual Studio debug-CRT的一个奇怪问题。
我的软件结构如下:
两个静态库在“多线程(调试)DLL”模式下编译,并与以下链接:
在“多线程(调试)”模式下编译的共享库(DLL)。从逻辑上讲,我应该说是相反的,但是随后我得到了大量的未解析符号。
最后,有一个在“多线程(调试)DLL”模式下编译的可执行文件,该可执行文件调用上述DLL。当我切换到“多线程(调试)”时,这里没有什么区别。
删除对象的崩溃发生在dbgheap.c / _heap_alloc_dbg_impl()-> mlock.c / _unlock()-
那么:可能是什么问题? Debug模式下是否确实存在某些CRT不兼容,还是其他原因?我非常确定这不是典型的内存泄漏,因为它可以在Linux和发行版中顺利运行。
最佳答案
当静态链接库时,必须注意使用相同的CRT“风味”。
当您使用DLL时:
那么您可以从使用不同CRT版本构建的可执行文件中使用它们,甚至可以从使用VC++编译器不同版本构建的可执行文件中使用它们。
但是,如果您的DLL在边界处具有C++类(如STL类),则对于静态链接库有严格的限制,即您必须为DLL和EXE使用动态链接的相同CRT版本(调试或发行版) ,并且EXE和DLL必须使用相同的编译器和相同的设置(例如
_HAS_ITERATOR_DEBUGGING
)构建。关于c++ - 在静态/动态库混合中链接Debug-CRT时崩溃?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15945219/