Код, который вы предоставили, компилируется и работает нормально - поэтому в той части, которую вы не предоставили, должна быть проблема - я подозреваю, что код внутри Add()
или его возвращаемый тип, или некоторое позднее использование указателей как necktschnagge Подозреваемый. Рабочий пример на gdbonline:https://onlinegdb.com/r1oyXGK2S
Прежде всего, я задаю вопрос, Какое преимущество вы хотели бы получить , используя std::unique_ptr
. Учтите, что уникальный указатель не гарантирует наличие pointee - внутри Add()
вы должны проверить на nullptr
! Я думаю, что из вашего использования вы не хотите использовать std::unique_ptr
:
Ключ в том, что std::unique_ptr
имеет только уникальное право собственности. любой из них:
func()
:: локальная область действия album::Add()
:: parameter_scope
владеет им.
Поскольку вы не использовали std::move()
, владение остается в func()
и будет уничтожено к концу func()
. Чтобы избежать этого, вы также можете использовать song.release()
(см. cpp-reference ).