c++ - 在具有不同 CRT 的库中使用 shared_ptr<T>

标签 c++ templates dll memory-management shared-ptr

我正在编写一个包含返回\接收接口(interface)的库 shared_ptr对象。

在我被提醒使用我的库的应用程序可以有不同的 CRT 版本和 STL 版本之前,一切看起来都很美好。

这引出了两个问题:

  1. 如果我的 .lib 和使用它的应用程序之间的 STL 版本不同,我如何确保 shared_ptr 的版本相同正在我的库和应用程序中使用? (STL 不提供二进制兼容性)

  2. 假设我通过复制 STL 的 header 定义 shared_ptr 解决了问题 1并将其重命名为 my_shared_ptr或者现在以任何方式给我相同的shared_ptr在我的库和应用程序中实现。 由于这是一个模板类,并且 CRT 版本不同,我如何确保 new有匹配的 delete ? 如果我的库编译 my_shared_ptr<SomeClass>然后应用程序编译 my_shared_ptr<SomeClass> , 每个编译都有自己的 newdelete根据 CRT 版本。 现在,当我创建并提交一个 shared_ptr从应用程序到我的库,完成后销毁,不匹配 newdelete可能会被调用。

我假设 my_shared_ptr<SomeClass> 的两个实例化是否正确?是否要编译,一个由 .lib 编译,一个由应用程序编译?

感谢您的帮助, 狮子座

最佳答案

AFAIK 你不能轻易做到这一点,尽管你可以想象创建一个二进制兼容的共享智能指针类,例如在 Microsoft 平台上使用 COM 对象。您仍然必须确保分配和释放都发生在同一个 DLL 中。这意味着替换智能指针类的“新建”和“删除”将调用从 DLL 导出的函数,保证调用正确的新建和删除实现。

关于c++ - 在具有不同 CRT 的库中使用 shared_ptr<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6760112/

相关文章:

c++ - 运行时动态加载库时报错 "unresolved external symbol"

vb.net - 使用 Visual Basic.Net 录制系统音频

c++ - C++线程和 promise

c++ - 使用 push_back c++ 读取特定列的数据

javascript - 将 JS 和 CSS 生成的变音符号提供给所有可能的主机页面编码的工作策略是什么

c++ - 获取模板错误

c++ - 泛型函数中类的泛化为基类创建目标代码?

c++ - 多线程执行的输出只发生一次?

c++ - 未初始化的局部变量

c++ - 仅用于保存 JPG 图像的简单 JPG 库(dll)?