首页 > 解决方案 > std::shared_ptr 带有别名构造函数,是否可以检索初始指针值?

问题描述

此 c++17 代码使用 shared_ptr 的(8) 别名构造函数

#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仅从中检索它?

标签: c++c++17shared-ptr

解决方案


您无法单独检索p_datashared_2

存储的值shared_2需要与原始指针无关,并且无法检索用于shared_ptr别名指针都共享相同管理块的初始值的“原始”值。

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


推荐阅读