使用old_pointer + 偏移量new_pointer设置shared_ptr



这是一个智能指针:std::shared_ptr<char> p(new char[size])表示填充了原始二进制文件内容的数组。在(并且仅在)整个数组从文件复制到 RAM 之后,我可以解析它,在此期间我检索一些标头信息(几个第一个双字)。然后是实际数据

在没有提供更多上下文的情况下,将提到的共享指针设置为实际数据开头的新地址对我来说很方便。此地址仍在定位的内存中。但是如何在不丢失的情况下设置呢?

一个问题是(是/否):是否可以在不调用删除数据的情况下将p设置为prevous指针的偏移量?

是的,这是可能的。您可以使用构造函数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()返回偏移地址,但原始数组将被正确删除。

注意:偏移量是每个shared_ptr的属性,因此,如果复制shared_ptrnsp,则会得到另一个具有相同偏移shared_ptr。无论您是构造新副本还是将副本分配给现有shared_ptr,这都有效。

这意味着您可以使用具有不同偏移量的不同shared_ptr,这些偏移量都管理相同的基础资源,这些资源只有在销毁所有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

相关内容

  • 没有找到相关文章

最新更新