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