Я имею в виду следующий вопрос к «Даункастинг» unique_ptr к unique_ptr , который, как мне кажется, сам по себе имеет смысл.
OP запрашиваетполучение unique_ptr<Derived>
из unique_ptr<Base>
, где последний объект имеет динамический тип Derived
, так что статический спад будет безопасным.
Обычно, (как 95% решений в Интернетепредположить, грубо говоря), простое решение было бы:
unique_ptr<Derived> ptr(static_cast<Derived*>(baseClassUniquePtr.release()));
OP также утверждает, хотя
PS. Есть дополнительное осложнение в том, что некоторые фабрики находятся в DLL, которые динамически загружаются во время выполнения, что означает, что мне нужно убедиться, что созданные объекты уничтожаются в том же контексте (пространстве кучи), в котором они были созданы. Передача права собственности (что обычно происходит в другом контексте) должна затем обеспечить удаление из исходного контекста. Но помимо необходимости предоставлять / приводить средство удаления вместе с указателем, проблема приведения должна быть такой же.
Теперь, похоже, решение состоит в том, чтобы получить средство удаления из объекта unique_ptr<Base>
ипередать его новому объекту, что явно приводит к unique_ptr<Derived, default_delete<Base>>
. Но default_delete
в любом случае не имеет статуса. Единственная разница - аргумент шаблона. Но так как мы всегда объявляем dtor
virtual
при использовании наследования с динамическим полиморфизмом в C ++, мы всегда вызываем ~Derived
в любом случае, так что я думаю, что исходное средство удаления в любом случае будет безопасным, позволяя чистое приведение к unique_ptr<Derived>
(без необязательного второго аргумента шаблона, который запрещает любое обычное хранение).
Итак, я понимаю, что у нас есть два пространства кучи при использовании библиотеки (DLL, .dylib, ...), которая создает объект и передаетэто к некоторому исполняемому файлу, я не понимаю, как копирование / перемещение средства удаления без сохранения состояния из старого объекта решает эту проблему.
Может ли решить эту проблему? Если да, то как? Если нет, как мы можем решить эту проблему?
--- Редактировать: Также ... get_deleter
возвращает ссылку на объект, лежащий в старом unique_ptr
, который разрушается, когда этот старый unique_ptr
уничтожен, не так ли? --- (глупый вопрос, потому что unique_ptr
вместе с удалителем явно перемещен)