Одна из фатальных проблем с необработанными указателями в том, что ничего вы не можете сделать, чтобы заметить, что где-то еще лишил законной силы ваш указатель. Умные указатели работают, отслеживая, кто знает об объекте, и уничтожая только когда последний указатель уничтожен.
std::weak_ptr
является дополнением к std::shared_ptr
и ничего больше. Он волшебным образом не знает, когда delete
вызывается для объекта, на который он указывает, он использует тот же механизм, который std::shared_ptr
делает, чтобы узнать о времени жизни объекта. Обратите внимание, что нет конструктора std::weak_ptr
, который принимает необработанный указатель.
Если библиотека управляет владельцем, то неверно для вас, чтобы поместить их в интеллектуальный указатель, который использует std::default_delete
. Лучшее, что вы можете сделать, - это использовать функцию release
библиотеки как средство удаления ваших умных указателей и обернуть функцию create
, чтобы вы возвращали такой умный указатель вместо необработанного.