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