Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用unique_ptr生成的堆元素是否移动到堆栈中,仍然在堆上分配?_C++_Stack_Smart Pointers_Heap Memory - Fatal编程技术网

C++ 使用unique_ptr生成的堆元素是否移动到堆栈中,仍然在堆上分配?

C++ 使用unique_ptr生成的堆元素是否移动到堆栈中,仍然在堆上分配?,c++,stack,smart-pointers,heap-memory,C++,Stack,Smart Pointers,Heap Memory,我无法理解唯一指针的行为。如果我在堆上分配一个对象 std::unique_ptr mMenuPtr(新主菜单) 然后push()和move()像这样把它放到我的游戏状态堆栈中 gameStates.push(std::move(mMenuPtr)); //pointer loses ownership of MainMenu during move 堆栈上的元素是否仍在堆上动态分配?如果是这样的话,在结束作用域销毁堆栈是否会释放我分配给new的内存,或者我是否需要其他方式来销毁该对象以防止内

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

std::unique_ptr mMenuPtr(新主菜单)

然后
push()
move()
像这样把它放到我的游戏状态堆栈中

gameStates.push(std::move(mMenuPtr)); //pointer loses ownership of MainMenu during move
堆栈上的元素是否仍在堆上动态分配?如果是这样的话,在结束作用域销毁堆栈是否会释放我分配给new的内存,或者我是否需要其他方式来销毁该对象以防止内存泄漏

我知道
unique\u ptr
的主要目的是在失去对象所有权后为您处理解除分配。我有点不知道该怎么办

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

像这样


GameState*statePtr=sScreen.get()
unique\u ptr
将始终释放对象,除非调用
release


GameState
对象仍在堆上分配。指针的所有权已传递给堆栈/向量。堆栈上的
unique\u ptr
在其析构函数中不会执行任何操作(因为其指针在移动后为空),如果堆栈/向量在再次移动对象之前被析构函数,则堆栈/向量的析构函数将调用delete。

unique\u ptr
将始终释放对象,除非调用
release


GameState
对象仍在堆上分配。指针的所有权已传递给堆栈/向量。堆栈上的
unique\u ptr
在其析构函数中不会执行任何操作(因为其指针在移动后为空),如果堆栈/向量在再次移动对象之前被析构函数,则堆栈/向量的析构函数将调用delete。

确定以澄清。。。堆栈的销毁将为我处理分配的游戏状态?是的,它调用其所有元素的析构函数,这将是唯一的_ptr,然后在其元素上调用析构函数(如果为NULL,则不调用)。好的,澄清一下。。。堆栈的销毁将为我处理分配的游戏状态?是的,它调用其所有元素的析构函数,这将是唯一的_ptr,然后在其元素上调用析构函数(如果为NULL,则不调用)。