c++ - 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
仅从中检索它?
解决方案
您无法单独检索p_data
。shared_2
存储的值shared_2
需要与原始指针无关,并且无法检索用于shared_ptr
别名指针都共享相同管理块的初始值的“原始”值。
您可以使用自定义删除器,并在创建时将数据存储在删除器中shared_ptr
,然后用于get_deleter
检索删除器,从而从中检索数据。