С появлением 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?