Как избежать висящего указателя с shared_ptr?
Не храня голые указатели (ни ссылки, ни итераторы) на объекте вообще, ни гарантируя, что время жизни такого указателя короче, чем время жизни общего указателя. Правильность последнего не так легко доказать, как правильность первого.
Как быть уверенным, что никто [не хранит голые указатели] в будущем
В языке C ++ нет функции, которая бы препятствовала получению адреса объекта и его сохранению, кроме полной инкапсуляции доступа к объекту. Программист всегда берет адрес на себя, чтобы убедиться в том, что время жизни - и будет в будущем - тем, что они ожидают. И ответственность за изменение времени жизни объекта несет программист, чтобы ничто не зависело от измененного времени жизни.
Существуют языки программирования , которые были разработаны таким образом, чтобы не позволить программисту напрямую обращаться к адресу объекта, что делает этот класс ошибок невозможным. C ++ не является одним из этих языков.