Почему использование ссылки или уникального указателя на член класса плохо? - PullRequest
1 голос
/ 01 июля 2019

В книге Херба Саттера и Андрея Александреску в правиле 52 "Стандарты кодирования C ++. 101 Правила, руководящие указания и лучшие практики" окончательная цитата:

"В редких случаях классы, которые имеют члены странных типов (например, ссылки, std :: auto_ptrs) являются исключением, потому что они имеют Своеобразная семантика копирования. В классе, содержащем ссылку или auto_ptr, вам, вероятно, нужно написать конструктор копирования и оператор присваивания, но деструктор по умолчанию уже делает правильно вещь. (Обратите внимание, что использование ссылки или элемента auto_ptr почти всегда неверно.)"

Понятно, почему использование ссылок в качестве членов не является хорошей идеей (ответ на этот вопрос находится в этом сообщении: Стоит ли предпочесть указатели или ссылки в данных членов? )

  1. Что касается современного C ++, значит ли это, что использование unique_ptr в качестве члена класса обычно плохо? Или это проблема только auto_ptr и отсутствующей семантики перемещения?
  2. Должен ли shared_ptr использоваться для полиморфного поведения?

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 01 июля 2019
  1. Что касается современного C ++, значит ли это, что использование unique_ptr в качестве члена класса обычно плохо?

Это не значитчто, и использование уникальных указателей не так уж и плохо.

Или это может быть проблема только с auto_ptr и отсутствующей семантикой перемещения?

Основная проблема заключается вэто копирование auto_ptr передает право собственности на указанный ресурс.Это то, на что автор ссылается с помощью «своеобразной семантики копирования».

Учитывая, что const auto_ptr не может быть скопировано, оно не так опасно, как неконстантное.Он имел нишевые применения, но не-копируемые типы довольно ограничены до C ++ 11.

Уникальный указатель не имеет особой семантики копирования.На самом деле уникальные указатели вообще не копируются.Это не такая большая проблема в C ++ 11, где тип может быть подвижным.Уникальные указатели охватывают все случаи использования, когда auto_ptr можно было использовать, а также другие случаи, когда auto_ptr был коварным.

Следует ли использовать shared_ptr для полиморфного поведения?

Можно использовать общий указатель, но это не обязательно.

PS auto_ptr устарел вC ++ 11 и полностью удален из стандартной библиотеки в C ++ 17.

1 голос
/ 01 июля 2019

Использование члена unique_ptr не является плохой практикой, поскольку класс, членом которого он является, является владельцем выделенного объекта.Однако это усложнит обработку класса, содержащего его, поскольку предотвращает копирование класса.Итак, если класс содержит какие-либо другие нетривиальные члены, то вам придется написать конструктор перемещения, оператор присваивания перемещения и деструктор для вашего класса.

Наоборот, я бы подумал об использовании shared_ptr как члены класса плохая практика, так как это не подразумевает какого-либо владения и приводит к недетерминированному времени жизни объекта в вашем коде, так как вы не представляете, когда последний экземпляр объекта, удерживаемого shared_ptr, являетсяосвобождена.

...