gpt4 book ai didi

c++ - 使用不相关的指针移动 shared_ptr

转载 作者:太空狗 更新时间:2023-10-29 23:05:41 24 4
gpt4 key购买 nike

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

我注意到 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com