这里引用了cppreference的实现说明部分std::shared_ptr,其中提到有两个不同的指针(如粗体所示):可以返回的指针get(),以及控制块中保存实际数据的指针.
在典型的实现中,
std::shared_ptr只保留两个指针:
- 存储的指针(返回一个
get())- 指向控制块的指针
控制块是一个动态分配的对象,它包含:
- 指向托管对象的指针或托管对象本身
- 删除(类型擦除)
- 分配器(类型擦除)
- 数量
shared_ptrs是自己的管理对象- 的数目
weak_ptrs引用该管理对象
shared_ptr直接保持的指针是由返回get()的指针,而控制块保持的指针或对象是当共享所有者的数量达到零时将被删除的指针或对象.这些指针不一定相等.
我的问题是,为什么托管对象需要两个不同的指针(两个粗体)(除了指向控制块的指针)?那个回来的人get()不够吗?为什么这些指针不一定相等?
我感兴趣的是这两行代码是否相同:
shared_ptr<int> sp(new int(1)); // double allocation?
shared_ptr<int> sp(make_shared<int>(1)); // just one allocation?
Run Code Online (Sandbox Code Playgroud)
如果这是真的,有人可以解释为什么在第二行只有一个分配?