2016-09-11 6 views
0

고유 포인터의 동작을 이해하는 데 문제가 있습니다. 내가 힙 개체 ... 그래서처럼 내 GameState 스택unique_ptr으로 만든 힙 요소가 여전히 힙에 할당 된 스택으로 이동 되었습니까?

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

다음 push()move()을 ... 할당하면

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

은 여전히 ​​동적으로 스택의 요소이다 힙에 할당 되었습니까? 그렇다면 끝 범위에서 스택을 제거하면 메모리가 new로 할당되었거나 메모리 누수를 방지하기 위해 해당 객체를 파괴하는 다른 방법이 필요합니까?

저는 unique_ptr의 주된 목적은 할당 취소를 처리하는 것이지만 그 객체의 소유권을 잃은 것입니다. 나는 무엇을 해야할지 알 수 없다.

STL API를 보면 의 get() 함수를 사용하면 move()을 수행 한 후 해당 객체에 다시 액세스 할 수 있으며, 그것은 내가 원하는 이유입니다. 왜냐하면 심지어 unique_ptr이 파괴 된 후에도 여러 파일에 걸쳐 스택 요소에 액세스 할 수 있기를 원하기 때문입니다.하지만 그 일을 수행하는 가장 이상적인 방법은 무엇입니까?

좋아요? release가 호출되지 않는 한

GameState* statePtr = sScreen.get();

답변

2

unique_ptr는 항상 객체를 사용할 수있게됩니다.

GameState 개체는 여전히 힙에 할당됩니다. 포인터의 소유권이 스택/벡터로 전달되었습니다. 스택상의 unique_ptr은 소멸자에서 아무 것도하지 않을 것입니다. (이동 후에 포인터가 NULL이기 때문에), 스택/벡터의 소멸자는 객체가 다시 이동하기 전에 스택/벡터가 소멸되면 delete를 호출합니다.

+0

그걸 명확히하기 위해 ... 스택을 파괴하면 나에게 할당 된 GameState가 처리 될 것입니까? – PrimRock

+1

예, 모든 요소의 소멸자를 호출합니다.이 요소는이 unique_ptr이되며,이 요소는 소멸자를 요소에서 호출합니다 (또는 NULL 인 경우에는 아무것도 표시하지 않습니다). –