我有一段代码绕过数据缓冲区。我想管理这些缓冲区的生存期,以便在使用完内存之前不会释放内存。我意识到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/

10-12 14:12
查看更多