С появлением std::unique_ptr
поврежденный std::auto_ptr
можно окончательно отложить. Поэтому в течение последних нескольких дней я меняю свой код на использование интеллектуальных указателей и устраняю все delete
из своего кода.
Хотя valgrind говорит, что мой код чист в памяти, семантическое богатство интеллектуальных указателей сделает более чистый и понятный код.
В большинстве кода перевод прост: используйте std::unique_ptr
вместо необработанных указателей, удерживаемых собственными объектами, выкиньте delete
и тщательно побрызгайте get()
, reset()
и move()
вызовы, если необходимо, хорошо взаимодействовать с остальной частью кода.
Я нахожусь в точке, где теперь я переводя не владеющие исходными указателями на интеллектуальные указатели.
Поскольку я был осторожен с временами жизни моих объектов (я гарантирую, что мои модули зависят только в одном направлении), valgrind говорит мне, что у меня нет никаких неинициализированных чтений, оборванных указателей или утечек. Итак, технически, я мог бы просто оставить те не владеющие исходными указателями сейчас.
Однако один из вариантов заключается в том, чтобы изменить те не владеющие исходными указателями на std::shared_ptr
, потому что я знаю, что они ацикличны. Или, было бы лучше оставить их в качестве исходных указателей?
Мне нужны советы ветеранских пользователей умных указателей относительно того, какие правила вы используете, чтобы решить, следует ли сохранять не владеющие исходными указателями как есть, или перевести их в std::shared_ptr
, имея в виду, что я постоянно тестирую блок и проверяю свой код.
EDIT: Возможно, я ошибаюсь в использовании std::shared_ptr
- их можно использовать в сочетании с std::unique_ptr
, или это так, если я использую std::shared_ptr
, все дескрипторы также должны быть std::shared_ptr
?