上下文
以下错误似乎是在告诉我,我无法从此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
答案 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; }