返回不重复所有权的unique_ptr私有成员数据

时间:2019-05-05 20:18:08

标签: c++ smart-pointers unique-ptr

上下文

以下错误似乎是在告诉我,我无法从此get函数返回名为unique_ptr的{​​{1}}。我只想返回我的m_head unique_ptr,而无需转移所有权。

自从引入智能指针以来,我一直在完全避免使用原始指针,因为原始指针不是异常安全的,具有内存管理开销和我所知道的其他问题。也许在某些情况下,我应该在较小范围内简要使用它们?

在这种情况下,我认为我需要转移所有权,而不是目前的方法。我应该改为由m_head管理对象,创建一个新的unique_ptr来管理对象,然后返回shared_ptr,但需要一些确认。我认为可能是因为std::unique_ptr文档说:

  

unique_ptr对象唯一拥有其指针:不得使用其他工具   负责删除对象,因此没有其他托管指针   应该指向其托管对象,因为他们必须尽快   unique_ptr对象删除其托管对象而无需考虑   说明其他指针是否仍指向同一对象   ,因此将所有其他指向该指针的指针保留为   无效的位置

错误

shared_ptr

代码

 `function "std::unique_ptr<_Ty, _Dx>::unique_ptr(const std::unique_ptr<_Ty, _Dx> &) 
 [with _Ty=mrobsmart::LinkedList::Node, _Dx=std::default_delete<mrobsmart::LinkedList::Node>]" 

 (declared at line 2337 of "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\include\memory")

 cannot be referenced  -- it is a deleted function

1 个答案:

答案 0 :(得分:2)

  

我只想返回我的unique_ptr m_head而不转移所有权。

那是不可能的。 unique_ptr围绕着每一步转移其所有权的行为而设计。

  

注意,自从引入智能指针以来,我一直在完全避免使用原始指针,因为原始指针不是异常安全的,具有内存管理开销和我所知道的其他问题,但是也许在某些情况下,应该在小范围内简短使用它们吗?

原始指针不是邪恶的。将它们用作纯引用/间接引用是一个完全有效的用例-不涉及所有权,内存管理或异常安全性。

当然,也可以返回C ++引用。是否选择指针还是引用取决于该值是否可以为null,但最终还是代码风格的问题。

因此,其中任何一个(重要的是const-限定功能):

    const Node* get_head() const { return m_head.get(); }
    const Node& get_head() const { return *m_head; }