我有一个奇怪的问题,即删除代码中的对象时会崩溃。对象是有效的,没有内存泄漏可以覆盖它们,并且仅在 Debug模式下会发生。用Linux编译的相同代码在调试和发行版本中都可以正常工作。因此,我猜想这是Visual Studio debug-CRT的一个奇怪问题。

我的软件结构如下:

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

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

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

那么:可能是什么问题? Debug模式下是否确实存在某些CRT不兼容,还是其他原因?我非常确定这不是典型的内存泄漏,因为它可以在Linux和发行版中顺利运行。

最佳答案

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

当您使用DLL时:

  • ,如果它们公开了纯C接口(interface)(例如,边界处没有STL类),并且您确保内存分配和释放都在库代码(或更常见的是both client and library use the same allocator)内完成
  • 或如果它们是 COM DLL

  • 那么您可以从使用不同CRT版本构建的可执行文件中使用它们,甚至可以从使用VC++编译器不同版本构建的可执行文件中使用它们。

    但是,如果您的DLL在边界处具有C++类(如STL类),则对于静态链接库有严格的限制,即您必须为DLL和EXE使用动态链接的相同CRT版本(调试或发行版) ,并且EXE和DLL必须使用相同的编译器和相同的设置(例如_HAS_ITERATOR_DEBUGGING)构建。

    关于c++ - 在静态/动态库混合中链接Debug-CRT时崩溃?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15945219/

    10-11 03:01
    查看更多