将shared_ptr与不相关的指针一起移动

时间:2013-08-14 17:24:53

标签: c++ pointers c++11

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

我注意到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不存在这样的构造函数。是否有一个原因?有没有办法在不增加引用次数的情况下做我想做的事情?

1 个答案:

答案 0 :(得分:1)

可能不存在,但是没有理由担心你。

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

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

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

some_pointer.reset();

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