Преобразование shared_ptr‹Type› в weak_ptr‹void› и обратно

Как мне получить weak_ptr<void> в shared_ptr<Type>?

Как мне заблокировать weak_ptr<void> и в конечном итоге создать shared_ptr<Type>?

Type имеет нетривиальный деструктор, правильно ли предположить, что weak_ptr<...> никогда не вызовет этот деструктор?

Слабый указатель void - это то, что мне нужно в этом случае, он используется только для отслеживания счетчика ссылок общих указателей нескольких типов и выдачи общих указателей на существующие объекты без собственного владения объектом (это часть одного объекта много менеджер ресурсов ссылок).


person Anne Quinn    schedule 26.07.2019    source источник
comment
Вероятно, одно из этих приведений: en.cppreference.com/w/cpp/memory/ shared_ptr/pointer_cast   -  person Justin    schedule 27.07.2019
comment
Непонятно, что именно вы спрашиваете о деструкторе. Вы спрашиваете, может ли уничтожение weak_ptr уничтожить общий объект? Или что именно?   -  person David Schwartz    schedule 27.07.2019
comment
@DavidSchwartz - Да. Этого не должно быть, поскольку он не имеет права собственности на него, но я хотел спросить, чтобы быть уверенным. Я могу опустить это, если это сделает вопрос мутным.   -  person Anne Quinn    schedule 27.07.2019
comment
Например, если только вы foo.lock(); и foo представляет собой weak_ptr, это может вызвать деструктор при некоторых условиях (поскольку он создает, а затем уничтожает shared_ptr).   -  person David Schwartz    schedule 27.07.2019
comment
@DavidSchwartz Но это не сам weak_ptr уничтожает объект, а результирующий shared_ptr выполняет свою работу, уничтожая объект, когда все ссылки на объект исчезают. Так что нет никаких проблем, потому что никто не оставлен заботиться.   -  person Remy Lebeau    schedule 27.07.2019
comment
@RemyLebeau Верно, но легко подумать, что никакая операция над weak_ptr не может уничтожить базовый объект, и что вызов lock является операцией над weak_ptr.   -  person David Schwartz    schedule 27.07.2019


Ответы (1)


Как мне получить weak_ptr<void> в shared_ptr<Type>?

std::shared_ptr<Type> неявно преобразуется в std::weak_ptr<void>.

Как мне заблокировать weak_ptr<void> и в конечном итоге создать shared_ptr<Type>?

Позвоните lock(), чтобы получить std::shared_ptr<void>, затем используйте std::static_pointer_cast.

Type имеет нетривиальный деструктор, правильно ли предположить, что weak_ptr<...> никогда не вызовет этот деструктор

да. Всякий раз, когда последний shared_ptr уничтожается, объект уничтожается. Если вы хотите сохранить объект живым, вы должны хранить shared_ptr<void>, а не weak_ptr<void>. Если вы не хотите, чтобы объект оставался живым, а просто хотите, чтобы weak_ptr всегда знал счетчик ссылок, тогда нет проблем.

person Brian Bi    schedule 26.07.2019