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

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

我有一个奇怪的问题,在我的代码中删除对象时我会崩溃。这些对象是有效的,没有内存泄漏可以覆盖它们,并且它只发生在 Debug模式下。使用 Linux 编译的相同代码在调试和发布版本中都能正常工作。所以我猜这是 Visual Studio 调试 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 类),那么对于静态链接库就有严格的限制,即您必须使用相同 CRT 风格(调试或发布)为 DLL 和 EXE 动态链接,并且 EXE 和 DLL 必须使用相同编译器和相同设置(如 _HAS_ITERATOR_DEBUGGING)构建。

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

相关文章:

php - 如何在 PHP (Laravel) 中调试 "Symfony\Component\Debug\Exception\FatalErrorException"错误?

java - 合并排序错误的输出

c++ - 如何运行示例 Armadillo 程序

c++ - 向下转换 C++ 时的不正确行为

c++ - MSI - 有条件注册 DLL

javascript - VS 2010 Javascript 匹配大括号/括号突出显示

使用 Eclipse 或其他方式在 linux 目标上进行 Java 远程调试

c++ - IP 地址重叠/在 CIDR 范围内

c++ - Vulkan-hpp 正在将非标准布局类重新解释为另一个类。这是合法的吗?

c# - 我需要对 IIS 中的虚拟目录进行一些说明