gpt4 book ai didi

c++ - 正确使用 shared_ptr 消除跨 DLL 边界的释放

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:21:47 33 4
gpt4 key购买 nike

我正在阅读“Using shared_ptr in dll-interfaces”。在那篇文章中,phlipsy 在他的回答结束时提出了一种方法,可以不跨 DLL 边界传递特定于实现的对象。基本上,这个想法是从 DLL 返回一个原始指针,并在带有该原始指针的 EXE 中初始化 shared_ptr

我不认为这是正确的。为了简单起见,让我重新制作它的原型(prototype)。

// 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());
..

我说得对吗?

最佳答案

你说的都是对的。第二种正确的方法是通过 createObject(..) 返回一个原始指针,用它初始化一个 shared_ptr 并将自定义删除器传递给 shared_ptr。自定义删除器是一个类似于 releaseObject(..) 的库函数。

编辑:使用您的版本(createObject(..) 返回 shared_ptr<..>),您将绑定(bind)到库和库用户的特定 shared_ptr 实现。在我提议的方式中,这个限制消失了。

关于c++ - 正确使用 shared_ptr 消除跨 DLL 边界的释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7785576/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com