6

我在 Visual Studio 2012 中有一个 dll 项目,它是用 /MT(静态多线程运行时库)编译的。还链接了第三方静态库,也是用/MT(库A)编译的,目前没有问题。

问题来自另一个静态库(库 B),不幸的是,它是用 /MD 编译的。在我的 dll 中,我需要链接两者,并且它们中的任何一个都没有替代品(而且我无法使用不同的选项重新编译它们)。我能够成功地将所有内容链接在一起,但现在我遇到了内存分配和删除问题 - 有时它无法删除分配的对象,有时会发生另一个奇怪的错误。我相信这是由我的 dll 的不同部分使用的混合内存管理函数引起的 - 当调用 new 时,会在库 B 中创建对象,但是当调用 delete 时,它​​会尝试使用不同的函数集释放内存 - 但我可能是错的。

所以我的问题是,这真的是由混合内存管理功能引起的吗?如果是这样,有没有办法让这项工作一起完成?

我想到的唯一解决方案是将库 B 包装在另一个用 /MD 编译的 dll 中,然后从原始 dll 使用它,以确保使用不同的内存管理功能。我不确定,如果这会有所帮助,我想避免它。

4

1 回答 1

6

您似乎已经了解了您所看到的问题的原因,并且在 MSDN 上描述如下

MSDN 截图

如果确实不可能让所有链接库都使用相同版本的 CRT,那么您唯一可能的选择是避免跨这些模块的边界传递 CRT 对象。您是否可以在您的场景中执行此操作完全取决于您的应用程序。上篇文章的重点是这句话:

如果您设计您的 DLL 以便它通过边界传递 CRT 对象或分配内存并希望它在 DLL 之外被释放,您限制 DLL 用户使用与 DLL 相同的 CRT 库副本。仅当与 CRT DLL 的相同版本链接时,DLL 及其用户才使用 CRT 库的相同副本。

我知道您已经说过不可能获取或构建兼容的模块以链接到您的应用程序,但我建议您彻底重新审视这一点,并避免不惜一切代价混合不同的 CRT 库。

于 2013-06-03T06:50:50.443 回答