将unique_ptr移到堆栈后生成的堆元素是否仍然在堆上分配

Are heap elements made with unique_ptr moved to the stack still allocated on the heap?

本文关键字:是否 元素 分配 ptr unique 后生 堆栈      更新时间:2023-10-16

我很难理解唯一指针的行为。如果我在堆上分配一个对象…

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

然后push()move()放到我的GameState堆栈中,像这样…

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

堆栈上的元素是否仍然在堆上动态分配?如果是这样,在结束作用域销毁堆栈是否会释放我用new分配的内存,或者我是否需要用其他方式销毁该对象以防止内存泄漏?

我知道unique_ptr的主要目的是为您处理释放,但在失去其对象的所有权之后。我有点不知道该怎么办。

查看STL API,似乎我唯一的选择是unique_ptr的get()函数,它允许我在执行move()后重新访问该对象,这就是我想要的,因为我仍然希望能够跨多个文件访问该堆栈元素,即使在unique_ptr破坏自己....之后但理想的方法是什么呢?

像这样?

GameState* statePtr = sScreen.get();

unique_ptr将始终释放对象,除非调用release

GameState对象仍然在堆上分配。指针的所有权被传递给堆栈/向量。堆栈上的unique_ptr在其析构函数中不做任何事情(因为它的指针在移动后为NULL),如果在再次移动对象之前对堆栈/向量进行了析构,则堆栈/向量的析构函数将调用delete。

相关文章: