Herb Sutter和Andrei Alexandrescu在规则52中撰写的“ C ++编码标准。101规则,指南和最佳实践”一书中,最后的引言是:
“在极少数情况下,类具有奇怪类型的成员(例如, 引用,std :: auto_ptrs)是一个例外,因为它们具有 特殊的复制语义。在持有参考文献或 auto_ptr,您可能需要编写复制构造函数和 赋值运算符,但是默认析构函数已经可以正确执行 事情。 (请注意,使用引用或auto_ptr成员几乎总是错误的。)”
很明显,为什么将引用用作成员不是一个好主意(此问题的答案在这篇文章中:Should I prefer pointers or references in member data?)
谢谢!
答案 0 :(得分:2)
- 对于现代C ++,这是否还意味着将unique_ptr用作类成员通常是不好的事情?
这并不意味着,并且使用唯一指针并不是一件坏事。
还是仅仅是auto_ptr的问题,也许缺少移动语义?
主要问题是复制auto_ptr
会转移指向资源的所有权。这就是作者所说的“特殊复制语义学”。
鉴于不能复制const auto_ptr
,它的危险性不如非const危险。它具有特殊用途,但是不可复制类型的使用在C ++ 11之前非常有限。
唯一指针没有特殊的复制语义。实际上,唯一指针根本不可复制。在类型可以移动的C ++ 11中,这并不是什么大问题。唯一指针涵盖了auto_ptr
可用的所有用例,以及auto_ptr
危险的其他用例。
- 那么,shared_ptr应该用于多态行为吗?
可以使用共享指针,但这不是必需的。
P.S。 auto_ptr
在C ++ 11中已弃用,并在C ++ 17中完全从标准库中删除。
答案 1 :(得分:1)
使用unique_ptr
成员并不是一个坏习惯,因为它所属的类是所分配对象的所有者。但是,这将使包含该类的类的处理方式复杂化,因为它阻止了该类可复制。因此,如果该类包含任何其他非平凡成员,那么您将必须为该类编写一个移动构造函数,一个移动赋值运算符和一个析构函数。
相反,我认为将shared_ptr
用作类成员是一种不好的做法,因为它并不意味着任何所有权,并且会导致代码中对象的生命周期不确定,因为您拥有不知道何时释放shared_ptr
持有的对象的最后一个实例。