我有一段代码传递数据缓冲区。我想管理这些缓冲区的生命周期,以便在使用它之前不会释放内存。我意识到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
不存在这样的构造函数。是否有一个原因?有没有办法在不增加引用次数的情况下做我想做的事情?
答案 0 :(得分:1)
可能不存在,但是没有理由担心你。
当复制共享指针时,当然会增加引用计数,但另一方面,在销毁共享指针时它会递减;因此:
std::shared_ptr<T> some_pointer = /**/;
std::shared_ptr<R> another_pointer(some_pointer, some_pointer->field());
some_pointer.reset();
在语义上与移动相同,只生成更多指令(如果没有优化)。