我正在编写一个包含返回\ receive shared_ptr
对象的接口的库。
在我被提醒使用我的库的应用程序可能有不同的CRT版本以及STL版本之前,一切看起来都很花哨。
这引出了两个问题:
如果我的.lib与使用它的应用程序之间的STL版本不同,我如何确保在我的lib和应用程序中使用相同版本的shared_ptr
? (STL不提供二进制兼容性)
让我说我通过复制STL定义shared_ptr
的标题并将其重命名为my_shared_ptr
或以任何方式解决问题1,现在我在lib上实现了相同的shared_ptr
实现和应用程序。
由于这是一个模板类,并且CRT版本不同,如何确保new
具有匹配的delete
?
如果我的lib编译my_shared_ptr<SomeClass>
并且应用程序编译my_shared_ptr<SomeClass>
,则根据CRT版本,每个编辑都会在其自己的new
和delete
中进行编辑。
现在,当我创建应用程序中的shared_ptr
并将其移至我的库中以便在完成时将其销毁,可能会调用new
和delete
不匹配。
我是否正确假设要编译my_shared_ptr<SomeClass>
的两个实例,一个由.lib编写,另一个由应用编译?
感谢您的帮助, 利奥
答案 0 :(得分:1)
AFAIK你不能轻易做到这一点,尽管你可以想象创建一个二进制兼容的共享智能指针类,例如,在Microsoft平台上使用COM对象。您仍然必须确保分配和释放都发生在同一个DLL中。这意味着替换智能指针类的“新”和“删除”将调用从DLL导出的函数,这些函数可以保证调用正确的new和delete实现。