std::weak_ptr
фактически указывает на блок метаданных, который std::shared_ptr
использует для отслеживания как местоположения объекта, так и времени его жизни. Если нет shared_ptr
, то нет блока метаданных.
Возможно, можно создать слабый указатель, который не полагается на std::shared_ptr
, но это не будет std::weak_ptr
. Слабый указатель и контейнер должны будут взаимодействовать на очень глубоком уровне - вы также замените std::multiset
.
Я считаю, что у вас может быть более серьезная проблема, однако ... если вы удаляете вещи из std::multiset
, это может сделать недействительными указатели на все элементы, а не только на удаленные. Хранение std::shared_ptr
внутри вашего устройства решит обе эти проблемы одновременно.
На самом деле вычеркнутый раздел не относится к ассоциативным контейнерам, включая std::multiset
. Другие типы контейнеров не будут безопасными. Multiset, однако, гарантирует, что
erase
члены должны сделать недействительными только итераторы и ссылки на стертые элементы