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
检索删除器,从而从中检索数据。
此 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
检索删除器,从而从中检索数据。