我在读“Using shared_ptr in dll-interfaces”。在那篇文章中,phlipsy提出了一种方法,在他的答案结束时,不跨DLL边界传递实现特定对象。基本上,这个想法是从DLL返回一个原始指针,并在原始指针中初始化EXE中的shared_ptr
。正确使用shared_ptr消除DLL边界上的重新分配
我不认为这是正确的。让我为简单重新排版。
// wrong version??
// DLL
Object* createObject()
{
return new Object;
}
// EXE
std::tr1::shared_ptr<Object> p(createObject());
..
当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());
..
对吗?
你是对的。手指交叉,两个模块使用相同的CRT版本。 –
在链接的答案中,他清楚地指出,当这样做时,您将自定义释放函数绑定到'shared_ptr'。 –
@丹尼斯,就是这一点。) –