gpt4 book ai didi

c++ - 为什么 std::shared_ptr 控制 block 需要持有指向具有正确类型的托管对象的指针

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

我正在查看以下 post 中的 shared_ptr 实现.一个我不太清楚的问题是,为什么除了在 shared_ptr 类本身中用 T* 类型存储的指针外,作者还需要存储托管对象指针的第二个拷贝及其具体输入控制 block (即 auximpl 中的 U* p;)。我明白为什么我们需要这个用于自定义删除器,而不是实际指针。看起来这符合标准的要求,当我阅读 cppreference 中的控制 block 描述时页。作者对此发表了以下评论

"this is needed to properly manage all the cases of T being a base forwhatever U having multiple T in the derivation hierarchy"

但我仍然想不出什么时候真正需要这样做的例子。有人可以举例说明吗?

谢谢,-格里戈尔

最佳答案

一种情况是使用 shared_ptr 的别名功能。

使用对象的成员创建一个 shared_ptr,但控制 block 相同,因此引用计数相同。

class holder : public std::enable_shared_from_this<holder>
{
int member;

public:

std::shared_ptr<int> get_member() {
return std::shared_ptr<int>(shared_from_this(), &member);
}
};

std::shared_ptr<int> foo()
{
auto ptr = std::make_shared<holder>();
return ptr->get_member();
}

在从 foo 的引用计数返回的对象变为 0 之前,在 make_shared 调用中创建的对象不会被释放。

关于c++ - 为什么 std::shared_ptr 控制 block 需要持有指向具有正确类型的托管对象的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72931173/

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