2016-09-11 2 views
0

У меня возникли проблемы с пониманием поведения уникальных указателей. Если я выделить объект на куче ...Являются ли элементы кучи, сделанные с помощью unique_ptr, перемещены в стек, все еще выделенные на кучу?

std::unique_ptr<GameState> mMenuPtr(new MainMenu);

, а затем push() и move() это на мой стек GameState как так ...

gameStates.push(std::move(mMenuPtr)); //pointer loses ownership of MainMenu during move 

ли элемент в стеке еще динамически выделено на кучу? Если да, то разрушает ли стек в конце области освобождает память, которую я выделил, или мне нужен другой способ разрушения этого объекта, чтобы предотвратить утечку памяти?

Я знаю, что основная цель unique_ptr заключается в том, чтобы обрабатывать освобождение для вас, но после потери собственности на свой объект. Я не знаю, что делать ...

Посмотрите на API STL, кажется, единственный вариант, который у меня есть, - это функция get() unique_ptr, которая позволяет мне повторно получить доступ к этому объекту после выполнения move(), это то, что я хочу, потому что я все еще хочу иметь доступ к этому элементу стека через несколько файлов даже после того, как unique_ptr уничтожает себя .... но что было бы идеальным способом сделать это?

Нравится?

GameState* statePtr = sScreen.get();

ответ

2

unique_ptr всегда будет освободить объект, если release не называется.

GameState объект по-прежнему выделяется на кучу. Собственность на указатель была передана стеку/вектору. unique_ptr в стеке ничего не сделает в своем деструкторе (поскольку его указатель равен NULL после перемещения), а деструктор стека/вектора вызовет delete, если стек/вектор будет разрушен до того, как объект будет перемещен снова.

+0

Хорошо, чтобы разъяснить, что ... Уничтожение стека позаботится о выделенном GameState для меня? – PrimRock

+1

Да, он вызывает деструктор всех его элементов, который будет этот unique_ptr, который затем вызывает деструктор на свой элемент (или ничего, если NULL). –

Смежные вопросы