std::shared_ptr 使用别名构造函数,是否可以检索初始指针值?

std::shared_ptr with aliasing constructor, is it possible the retrieve the initial pointer value?

此 c++17 代码使用 shared_ptr 的 (8) aliasing constructor

#include <iostream>
#include <memory>

using namespace std;

int main()
{
  auto shared_1 = std::shared_ptr<int[]>(new int[10], std::default_delete<int[]>());

  int* p_data = shared_1.get(); 

  auto shared_2 = std::shared_ptr<int[]>(shared_1, p_data + 5); // aliasing constructor

  std::cout << std::hex << p_data << "\t" << shared_1.get() << std::endl;

  std::cout << std::hex << p_data + 5 << "\t" << shared_2.get() << std::endl; // Is it possible 
                                                                              // to retrieve the
                                                                              // initial p_data value?
}

并打印:

0x556f38865e70    0x556f38865e70
0x556f38865e84    0x556f38865e84

问题: 假设我只存储 shared_2(而不是 shared_1+5 偏移量),这个 p_data 初始值(存储在 shared_1 中)是否丢失或者如果是否仍然可以仅从 shared_2 检索它?

您无法单独从 shared_2 中检索 p_data

存储在 shared_2 中的值不需要与原始指针相关,并且无法检索用于别名的初始 shared_ptr 的 "original" 值指针都共享同一个管理块。

您可以使用自定义删除器,并在创建 shared_ptr 时将数据存储在删除器中,然后使用 get_deleter 检索删除器,从而从中检索数据。