gpt4 book ai didi

c++ - 使用 old_pointer + offset 的 new_pointer 设置 shared_ptr

转载 作者:IT老高 更新时间:2023-10-28 12:43:13 25 4
gpt4 key购买 nike

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

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

一个问题是(是/否):是否可以设置 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() 返回偏移地址,但原始数组将被正确删除。

注意: offseteach 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

关于c++ - 使用 old_pointer + offset 的 new_pointer 设置 shared_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54737556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com