我正在阅读 ”在 dll 接口中使用共享指针 https://stackoverflow.com/questions/1605640/using-shared-ptr-in-dll-interfaces”。在那篇文章中,phlipsy 在他的回答的最后提出了一种不跨 DLL 边界传递特定于实现的对象的方法。基本上,这个想法是从 DLL 返回一个原始指针并初始化shared_ptr
在带有原始指针的 EXE 中。
我认为这是不正确的。为了简单起见,让我重新设计它。
// wrong version??
// DLL
Object* createObject()
{
return new Object;
}
// EXE
std::tr1::shared_ptr<Object> p(createObject());
..
When object
被释放,所使用的销毁上下文/堆shared_ptr
与构造时在 DLL 中使用的不同。
正确的使用方法shared_ptr
是资源分配应该与初始化在同一行shared_ptr
,这样分配和释放就可以使用同一个堆,如下所示。
// right version
// DLL
std::tr1::shared_ptr<Object> createObject()
{
return std::tr1::shared_ptr<Object>(new Object);
}
// EXE
std::tr1::shared_ptr<Object> p(createObject());
..
我对吗?
你这两种说法都是对的。第二种正确的方法是通过 createObject(..) 返回一个原始指针,用它初始化一个shared_ptr,并将一个自定义删除器传递给shared_ptr。自定义删除器是一个库函数,例如releaseObject(..)。
编辑:
使用您的版本(createObject(..) 返回一个shared_ptr<..>),您将绑定到库和库用户的特定shared_ptr 实现。按照我提议的方式,这个限制就消失了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)