我正在阅读" 在dll-interfaces中使用shared_ptr ".在那篇文章中,phlipsy提出了一种方法,在他的答案结束时,不跨DLL边界传递任何特定于实现的对象.基本上,我们的想法是从DLL返回一个原始指针,并shared_ptr在原始指针的EXE中初始化.
我不认为这是正确的.让我为了简单而重新定型.
// wrong version??
// DLL
Object* createObject()
{
return new Object;
}
// EXE
std::tr1::shared_ptr<Object> p(createObject());
..
Run Code Online (Sandbox Code Playgroud)
当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());
..
Run Code Online (Sandbox Code Playgroud)
我对吗?
两种陈述你都是对的.第二种正确的方法是通过createObject(..)返回原始指针,用它初始化shared_ptr并将自定义删除器传递给shared_ptr.自定义删除器是一个像releaseObject(..)这样的库函数.
编辑:使用您的版本(createObject(..)返回shared_ptr <..>),您将绑定到库和库用户的特定shared_ptr实现.以我提议的方式,这种限制已经消失.