1

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

我的软件结构如下:

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

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

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

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

4

1 回答 1

1

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

使用 DLL 时:

  • 如果它们公开了纯 C 接口(例如边界处没有 STL 类)并且您确保内存分配和释放都在库代码中完成(或者,更一般地说,客户端和库都使用相同的分配器

  • 或者如果它们是COM DLL

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

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

于 2013-04-11T10:04:00.537 回答