3

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

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

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

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

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

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

4

1 回答 1

1

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

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

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

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

some_pointer.reset();

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

于 2013-08-14T17:41:33.847 回答