将 shared_ptr 设置为 new_pointer 即 old_pointer + offset
Set shared_ptr with new_pointer that is old_pointer + offset
这是一个智能指针:std::shared_ptr<char> p(new char[size])
表示用原始二进制文件内容填充的数组。在(且仅在)整个数组从文件复制到 RAM 之后,我可以解析它,在此期间我检索了一些 header 信息(一些第一个双字)。然后是实际数据。
在不提供更多上下文的情况下,将提到的共享指针设置为 实际数据 开头的新地址对我来说很方便。该地址仍在分配的内存中。但是怎么设置才不会丢失呢?
一个问题是(yes/no):是否可以将p
设置为前一个指针的偏移量,而不调用数据删除?
是的,这是可能的。您可以使用构造函数 8
, 别名构造函数 来自此参考:https://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr
// make sure you use an array deleter
std::shared_ptr<char> osp(new char[1024], std::default_delete<char[]>());
// load the data into your buffer at osp.get()
// Find the offset in the data by parsing
auto const offset = parse_buffer_for_offset(osp.get());
// Now set a new offset into the data
std::shared_ptr<char> nsp(osp, osp.get() + offset);
现在 nsp.get()
returns 偏移地址,但原始数组将被正确删除。
注: offset 是 each 的 属性 shared_ptr
所以如果你 复制 shared_ptr
nsp
你会得到另一个 shared_ptr
具有 相同的偏移量 .无论您是构建新副本还是将副本分配给现有 shared_ptr
.
,这都适用
这意味着你可以有不同的 shared_ptr
和不同的偏移量,它们都管理相同的底层资源,这些资源只会在 all shared_ptr
之后被清理被摧毁。
要在操作中看到这一点,请考虑以下代码:
std::shared_ptr<char> original_sp(new char[1024], std::default_delete<char[]>());
std::shared_ptr<char> offset_100_sp1(original_sp, original_sp.get() + 100);
std::shared_ptr<char> offset_100_sp2 = offset_100_sp1;
std::shared_ptr<char> offset_200_sp1(original_sp, original_sp.get() + 200);
std::shared_ptr<char> offset_200_sp2 = offset_200_sp1;
std::cout << "\nPointers managing the array: " << original_sp.use_count() << '\n';
std::cout << "\nOffset 100 pointers:" << '\n';
std::cout << std::distance(original_sp.get(), offset_100_sp1.get()) << '\n';
std::cout << std::distance(original_sp.get(), offset_100_sp2.get()) << '\n';
std::cout << "\nOffset 200 pointers:" << '\n';
std::cout << std::distance(original_sp.get(), offset_200_sp1.get()) << '\n';
std::cout << std::distance(original_sp.get(), offset_200_sp2.get()) << '\n';
输出:
Pointers managing the array: 5
Offset 100 pointers:
100
100
Offset 200 pointers:
200
200
这是一个智能指针:std::shared_ptr<char> p(new char[size])
表示用原始二进制文件内容填充的数组。在(且仅在)整个数组从文件复制到 RAM 之后,我可以解析它,在此期间我检索了一些 header 信息(一些第一个双字)。然后是实际数据。
在不提供更多上下文的情况下,将提到的共享指针设置为 实际数据 开头的新地址对我来说很方便。该地址仍在分配的内存中。但是怎么设置才不会丢失呢?
一个问题是(yes/no):是否可以将p
设置为前一个指针的偏移量,而不调用数据删除?
是的,这是可能的。您可以使用构造函数 8
, 别名构造函数 来自此参考:https://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr
// make sure you use an array deleter
std::shared_ptr<char> osp(new char[1024], std::default_delete<char[]>());
// load the data into your buffer at osp.get()
// Find the offset in the data by parsing
auto const offset = parse_buffer_for_offset(osp.get());
// Now set a new offset into the data
std::shared_ptr<char> nsp(osp, osp.get() + offset);
现在 nsp.get()
returns 偏移地址,但原始数组将被正确删除。
注: offset 是 each 的 属性 shared_ptr
所以如果你 复制 shared_ptr
nsp
你会得到另一个 shared_ptr
具有 相同的偏移量 .无论您是构建新副本还是将副本分配给现有 shared_ptr
.
这意味着你可以有不同的 shared_ptr
和不同的偏移量,它们都管理相同的底层资源,这些资源只会在 all shared_ptr
之后被清理被摧毁。
要在操作中看到这一点,请考虑以下代码:
std::shared_ptr<char> original_sp(new char[1024], std::default_delete<char[]>());
std::shared_ptr<char> offset_100_sp1(original_sp, original_sp.get() + 100);
std::shared_ptr<char> offset_100_sp2 = offset_100_sp1;
std::shared_ptr<char> offset_200_sp1(original_sp, original_sp.get() + 200);
std::shared_ptr<char> offset_200_sp2 = offset_200_sp1;
std::cout << "\nPointers managing the array: " << original_sp.use_count() << '\n';
std::cout << "\nOffset 100 pointers:" << '\n';
std::cout << std::distance(original_sp.get(), offset_100_sp1.get()) << '\n';
std::cout << std::distance(original_sp.get(), offset_100_sp2.get()) << '\n';
std::cout << "\nOffset 200 pointers:" << '\n';
std::cout << std::distance(original_sp.get(), offset_200_sp1.get()) << '\n';
std::cout << std::distance(original_sp.get(), offset_200_sp2.get()) << '\n';
输出:
Pointers managing the array: 5
Offset 100 pointers:
100
100
Offset 200 pointers:
200
200