gpt4 book ai didi

c++ - 关于将boost共享指针转换为标准共享指针的问题

转载 作者:行者123 更新时间:2023-12-05 01:24:10 26 4
gpt4 key购买 nike

这更像是关于 the second answer 的后续问题发布here .此答案的代码如下所示:

template<typename T>
void do_release(typename boost::shared_ptr<T> const&, T*)
{
}

template<typename T>
typename std::shared_ptr<T> to_std(typename boost::shared_ptr<T> const& p)
{
return
std::shared_ptr<T>(
p.get(),
boost::bind(&do_release<T>, p, _1));

}

我对上面代码的理解是,一个仿函数是从 do_release 中创建的,它与我们试图转换的 boost shared_ptr 绑定(bind),并作为自定义删除器传入。

我目前的想法是(可能是错误的):新标准 shared_ptr 不持有 boost shared_ptr 持有的任何现有引用计数,但在这次“转换”之后只有一个引用计数。当调用标准 shared_ptr 析构函数时,它会调用自定义删除器,然后触发 boost shared_ptr 上的析构函数?因此,堆资源的引用计数和生命周期仍然由 boost shared_ptr 有效维护。我的意思是,如果在调用自定义删除器时 boost shared_ptr 上的引用计数 > 0(在取消引用 1 之后),它仍然不会破坏堆内存。

但是如果标准的 shared_ptr 被复制了怎么办?这种转换仍然有效吗?我认为这是因为当复制标准 share_ptr 时,它会增加引用计数,但它是由标准 shared_ptr 维护的引用计数,因此堆资源上的整体引用计数仍然是正确的。但是现在引用计数由标准 + boost shared_ptr 维护?

我说的对吗?

最佳答案

创建的共享指针有一个具有状态的销毁函数对象(删除器)。特别是它有一个 boost shared ptr 的拷贝。

销毁操作什么都不做,删除器的销毁清理了 boost shared ptr。

不过有个问题:

C++ 标准是否完全指定删除器本身的清理?例如。当只剩下弱引用时它可能会留下来?标准确实保证了删除器的最小生命周期,留下了比这更长的生命周期的可能性。

销毁销毁对象指定发生在 std::shared_ptr 的构造函数或 std::shared_ptr 的析构函数中.在它被调用之后或在引用计数 block 被销毁时销毁它是合理的——在第二种情况下,我们最终让它持续到最后一个弱 ptr 消失。

来自标准草案:

[Note: It is unspecified whether the pointer remains valid longer than that. This can happen if the implementation doesn’t destroy the deleter until all weak_ptr instances that share ownership with p have been destroyed. — end note]

推迟销毁删除器的可能性很明显。因此,在那种情况下,我们最终会得到 shared_ptr,当我们希望根据运行它的 C++ 实现的未指定细节调用它时,它不会破坏它们的元素实例。这是个坏主意。

更好的选择

我个人会根据 aliasing constructor 使用类似的技巧反而。它同样简单,没有额外的开销,而且语义实际上是正确的:

template<class T>
std::shared_ptr<T>
as_std_shared_ptr(boost::shared_ptr<T> bp)
{
if (!bp) return nullptr;
// a std shared pointer to boost shared ptr. Yes.
auto pq = std::make_shared<boost::shared_ptr<T>>(std::move(bp));
// aliasing ctor. Hide the double shared ptr. Sneaky.
return std::shared_ptr<T>(pq, pq.get()->get());
}

与问题中的代码相比,这更像是黑客攻击,因为生命周期boost shared ptr 不再与删除器实例的(未指定)生命周期相关联。

关于c++ - 关于将boost共享指针转换为标准共享指针的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71572186/

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