为什么使用类的引用或唯一指针成员是一件坏事?

时间:2019-07-01 10:06:59

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

Herb Sutter和Andrei Alexandrescu在规则52中撰写的“ C ++编码标准。101规则,指南和最佳实践”一书中,最后的引言是:

  

“在极少数情况下,类具有奇怪类型的成员(例如,   引用,std :: auto_ptrs)是一个例外,因为它们具有   特殊的复制语义。在持有参考文献或   auto_ptr,您可能需要编写复制构造函数和   赋值运算符,但是默认析构函数已经可以正确执行   事情。   (请注意,使用引用或auto_ptr成员几乎总是错误的。)

很明显,为什么将引用用作成员不是一个好主意(此问题的答案在这篇文章中:Should I prefer pointers or references in member data?

  1. 对于现代C ++,这是否还意味着将unique_ptr用作类成员通常是一件坏事?还是仅仅是auto_ptr的问题,也许缺少移动语义?
  2. 那么,shared_ptr应该用于多态行为吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

  
      
  1. 对于现代C ++,这是否还意味着将unique_ptr用作类成员通常是不好的事情?
  2.   

这并不意味着,并且使用唯一指针并不是一件坏事。

  

还是仅仅是auto_ptr的问题,也许缺少移动语义?

主要问题是复制auto_ptr会转移指向资源的所有权。这就是作者所说的“特殊复制语义学”。

鉴于不能复制const auto_ptr,它的危险性不如非const危险。它具有特殊用途,但是不可复制类型的使用在C ++ 11之前非常有限。

唯一指针没有特殊的复制语义。实际上,唯一指针根本不可复制。在类型可以移动的C ++ 11中,这并不是什么大问题。唯一指针涵盖了auto_ptr可用的所有用例,以及auto_ptr危险的其他用例。

  
      
  1. 那么,shared_ptr应该用于多态行为吗?
  2.   

可以使用共享指针,但这不是必需的。

P.S。 auto_ptr在C ++ 11中已弃用,并在C ++ 17中完全从标准库中删除。

答案 1 :(得分:1)

使用unique_ptr成员并不是一个坏习惯,因为它所属的类是所分配对象的所有者。但是,这将使包含该类的类的处理方式复杂化,因为它阻止了该类可复制。因此,如果该类包含任何其他非平凡成员,那么您将必须为该类编写一个移动构造函数,一个移动赋值运算符和一个析构函数。

相反,我认为将shared_ptr用作类成员是一种不好的做法,因为它并不意味着任何所有权,并且会导致代码中对象的生命周期不确定,因为您拥有不知道何时释放shared_ptr持有的对象的最后一个实例。