c++ - 使用不相关的指针移动 shared_ptr

标签 c++ pointers c++11

我有一段代码可以传递数据缓冲区。我想管理这些缓冲区的生命周期,以便在我使用完之前不会释放内存。我意识到 std::shared_ptr 适合这个任务。我想做的一件事是将缓冲区的一部分传递给函数,同时仍保留整个缓冲区的所有权信息(例如,切断 header 并将主体传递给另一个函数)。

我注意到 std::shared_ptr 具有以下构造函数:

template< class Y >
shared_ptr( const shared_ptr<Y>& r, T *ptr );

此构造函数允许我创建一个新的 shared_ptr,它与 r 共享所有权,但存储指针 ptr。这很好,但这会导致引用计数增加。在某些情况下,我可能希望传递缓冲区的一部分而不保留 shared_ptr 给它。在这种情况下,我不需要增加引用计数。看来我需要以下构造函数:

template< class Y >
shared_ptr( shared_ptr<Y>&& r, T *ptr );

请注意,r 是一个右值引用。 std::shared_ptr 似乎不存在这样的构造函数。是否有一个原因?有没有办法在不增加引用计数的情况下做我想做的事?

最佳答案

它可能不存在,但是没有什么理由让您担心。

当然,复制共享指针时引用计数会增加,但另一方面,销毁共享指针时引用计数会减少;因此:

std::shared_ptr<T> some_pointer = /**/;

std::shared_ptr<R> another_pointer(some_pointer, some_pointer->field());

some_pointer.reset();

将在语义上与移动相同,并且只生成更多指令(如果没有优化的话)。

关于c++ - 使用不相关的指针移动 shared_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18238302/

相关文章:

c++ - std::sort 降序与运算符重载

c++ - 包含非可移动构造字段的类型如何成为可移动构造的?

c++ - 使用 lambda 从 std::function 返回类型推导模板参数类型

c++ - 了解 C++ 中的运算符重载

c++ - 为什么我需要转换算法 remove() 的参数?

c++ - 我是否在此算法中正确地重新安排了我的 LinkedList 节点?

c - 通过 C 中的指针双数组

c++ - 图标不是 3.00 格式

c++ - 如何在运行时添加osgEarth功能?

c++ - 返回与。指针