我有一段代码绕过数据缓冲区。我想管理这些缓冲区的生存期,以便在使用完内存之前不会释放内存。我意识到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
并不存在这样的构造函数。是否有一个原因?有没有一种方法可以做我想要的而不会增加引用计数? 最佳答案
它可能不存在,但是没有什么理由会让您担心。
当然,在复制共享指针时,引用计数会增加,但是另一方面,销毁一个共享指针时,引用计数会减少;因此:
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/