c++ - 如何更改 shared_ptr 中的指针而不失去删除内存的能力?

标签 c++ memory boost shared-ptr

我遇到了 std::shared_ptr 的问题.我有一个代码:

void Receive(const std::shared_ptr<char[]>& data, uint32_t length) {
  this->next->Receive(data + 2, length - 2);
}
我需要将 shared_ptr 增加 2 而不会失去删除内存的能力。
我不想复制数据,因为数据已经在内存中并且我拥有数据。如果我可以更改指针而不损失性能,那么复制数据只是为了替换和删除旧数据是愚蠢的。 shared_ptr 可以包含并返回一个指针,但删除另一个?
据我所知,shared_ptr 的内部包含一个指向 get() 返回的数据的指针。函数并包含对控制 block 的引用,该控制 block 对引用进行计数,并且应该在所有引用都消失后删除内存。
那么,由于它包含与控制 block 分开的指针,也许我可以在不更改指向控制 block 中分配的内存块的指针的情况下以某种方式更改它,而不会失去删除内存的能力?如果我不能,也许我可以用 boost::shared_ptr ?
我还没有检查过。我不使用 Boost图书馆,但如果它对我有帮助,我会的。

最佳答案

是的,这就是 std::shared_ptr 的别名构造函数。是为了。它保留相同的控制 block ,但它允许您使用另一个指针。
签名是

template< class Y >
shared_ptr( const shared_ptr<Y>& r, element_type* ptr ) noexcept;
在你的情况下,那将是
void Receive(const std::shared_ptr<char[]>& data, uint32_t length) {
  std::shared_ptr<char[]> alias(data, data.get()+2);
  this->next->Receive(alias, length - 2);
}
但我确实质疑 shared_ptr 的使用。在这种情况下。在这种情况下,您真的拥有共享所有权吗?你不能找出可以拥有这个内存的代码的一部分吗?

关于c++ - 如何更改 shared_ptr 中的指针而不失去删除内存的能力?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68364460/

相关文章:

c++ - Matlab - 累积分布函数(CDF)

c++ - 使用 opencv 通过 Filestorage 保存时出错

c++ - 如何替换 Lua 默认错误打印?

c - 这个 Valgrind 警告是什么意思? - 警告设置地址范围权限

memory - 如何在内存有限的嵌入式系统上使用AT读取短信?

c - 使用 GCC + ARM 减少递归期间的堆栈使用

c++ - 如何确保在动态库文件中使用静态链接的 Boost

c++ - deadline_timer::wait 是否屈服于其他任务?

c++ - 如何读取 .inf 文件?

c++ - Unresolved external 链接问题