【发布时间】:2016-03-06 21:22:45
【问题描述】:
这是cppreference的std::shared_ptr的实现注释部分的引用,其中提到有两个不同的指针(如粗体所示):一个可以由get()返回,一个包含实际数据控制块。
在典型的实现中,
std::shared_ptr只包含两个指针:
- 存储的指针(
get()返回的指针)- 指向控制块的指针
控制块是一个动态分配的对象,它包含:
- 指向托管对象的指针或托管对象本身
- 删除器(类型擦除)
- 分配器(类型擦除)
- 拥有托管对象的
shared_ptrs的数量- 引用托管对象的
weak_ptrs的数量
shared_ptr直接持有的指针是get()返回的指针,而控制块持有的指针或对象是共享所有者数为零时删除的指针或对象。这些指针不一定相等。
我的问题是,为什么托管对象需要两个不同的指针(粗体中的两个)(除了指向控制块的指针)? get() 返回的还不够吗?为什么这些指针不一定相等?
【问题讨论】:
-
IIUC 这意味着实际上可能至少涉及 三个 指针: 1. get() 返回的东西; 2. 可能是控制块内指向最终将被删除的对象的指针; 3. 指向控制块的指针。其中两个由共享的 ptr 持有;第三个位于控制块内。
-
这是一个不同的问题,正如我在之前的评论中指出的那样。它不关心控制块与对象,而是有 two 指向“对象”的指针,这些指针甚至可能不同(或者不需要持有其中两个) . 加上 ptr 到控制块。 (答案显然与别名 shared_ptr 构造函数有关。)
-
据我了解,stackoverflow.com/a/26351926 的答案是关于两种构造方法的区别,但仍然没有解释为什么首先需要两种可能不同的分配。
-
@PeterA.Schneider 好的,我发现这个问题令人困惑和模棱两可。它肯定可能问一些与我想的不同的东西。
标签: c++ pointers c++11 shared-ptr