gpt4 book ai didi

c++ - 使用智能指针变得聪明 : avoiding shared_ptr overuse

转载 作者:太空狗 更新时间:2023-10-29 19:39:14 25 4
gpt4 key购买 nike

我遇到过这样的代码

bool open_resource(..., shared_ptr<resource> & res)
{
...
shared_ptr<resource> newResource(new resource(...));
res = move(newResource);
return true;
}

然后调用

shared_ptr<resource> res;
open_resource(..., res);

然后,据我所知,res 没有以需要共享指针的方式使用。

当然是马上想到要换

   shared_ptr<resource> newResource(new resource(...));
res = move(newResource);

res = make_shared<resource>(...)

...但后来我遇到了障碍。现在我不能再建议将 shared_ptr 引用更改为更基本的内容;至少如果我想确保,如果调用者以后确实需要一个 shared_ptr,则控制 block 有效地驻留在与对象相同的分配上。为此,它必须从一开始就是一个 shared_ptr。

另一方面,shared_ptr 是一个“重”类型;它有两个计数器和别名以及在大多数调用站点中似乎真的不需要的各种功能。然而,如果它是签名中的 shared_ptr,则他们必须使用。

我看到的最佳解决方案是将函数体移动到辅助函数,然后重载。

bool get_resource_parameters(Param1& param1,..., ParamN& paramN)
{
...
}

bool open_resource(..., shared_ptr<resource> & res)
{
Param1 param1;
...
ParamN paramN;
if(!get_resource_parameters(param1,...,paramN))
return false;

res = make_shared<resource>(param1,...,paramN);
return true;
}

bool open_resource(..., unique_ptr<resource> & res)
{
Param1 param1;
...
ParamN paramN;
if(!get_resource_parameters(param1,...,paramN))
return false;

res = unique_ptr<resource>(new resource(param1,...,paramN));
return true;
}

但确实不尽如人意。

有没有人看到更好、更 C++ 的解决方案?

编辑

是的,C++ 方法是返回指针而不是 bool 值(并检查是否为空)。在这种情况下,我不能重载 shared_ptr,但我可以将返回的 unique_ptr 临时分配给 shared_ptr 变量,适当的构造函数将转换它。

但是,这样我就失去了 make_shared 的单一分配。我可以保存吗?

最佳答案

std::shared_ptr 有一个 converting constructor from std::unique_ptr .为什么不让函数按值返回 std::unique_ptr:

unique_ptr<resource> open_resource(...);

这也作为一个文档,表明这是一个将 resource 的所有权转移给调用者的工厂函数。

让调用者决定他们想要的方式:

auto x = open_resource(...);
// or
std::shared_ptr<resource> x{open_resource(...)};

关于c++ - 使用智能指针变得聪明 : avoiding shared_ptr overuse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37344585/

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