如何在不失去删除内存的能力的情况下更改 shared_ptr 中的指针?

How can I change the pointer in shared_ptr without losing the ability to delete the memory?

我遇到了 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 可以包含和 return 一个指针,但删除另一个指针吗?

据我所知,shared_ptr 的内部包含一个指向数据的指针,该数据由 get() 函数 return 编辑,并包含对计数的控制块的引用引用并应该在所有引用都消失后删除内存。

因此,由于它包含与控制块分开的指针,也许我可以以某种方式更改它而不更改指向控制块中分配的内存块的指针,而不会失去删除内存的能力?如果我做不到,也许我可以用 boost::shared_ptr?

我还没有检查过。我不使用 Boost 库,但如果它对我有帮助,我会的。

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

签名是

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。在这种情况下你真的拥有共享所有权吗?你能不能找出一段代码可能拥有这块内存?