C++11: Заменить все несобственные сырые указатели на std::shared_ptr()?

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

57
задан R. Martinho Fernandes 1 December 2011 в 09:56
поделиться