在具有不同CRT的库中使用shared_ptr <t> </t>

时间:2011-07-20 09:58:57

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

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

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

这引出了两个问题:

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

  2. 让我说我通过复制STL定义shared_ptr的标题并将其重命名为my_shared_ptr或以任何方式解决问题1,现在我在lib上实现了相同的shared_ptr实现和应用程序。 由于这是一个模板类,并且CRT版本不同,如何确保new具有匹配的delete? 如果我的lib编译my_shared_ptr<SomeClass>并且应用程序编译my_shared_ptr<SomeClass>,则根据CRT版本,每个编辑都会在其自己的newdelete中进行编辑。 现在,当我创建应用程序中的shared_ptr并将其移至我的库中以便在完成时将其销毁,可能会调用newdelete不匹配。

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

    感谢您的帮助, 利奥

1 个答案:

答案 0 :(得分:1)

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