将unique_ptr移到堆栈后生成的堆元素是否仍然在堆上分配
Are heap elements made with unique_ptr moved to the stack still allocated on the heap?
我很难理解唯一指针的行为。如果我在堆上分配一个对象…
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。
相关文章:
- 是否可以在c++中处理字符串流中的各个元素
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 检查 2D 网格的某个元素是否与另一个元素共享对角线、水平线或垂直线
- 是否可以使用 new 指定具有宏常量的动态分配数组的元素?
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- 如何知道地图中的最后一个元素是否被删除?
- 检查 TinyXML 中的元素是否存在
- 经过最后一个数组元素末尾的指针是否应该等于超过整个数组末尾的指针?
- 是否需要 mutex() 来安全地同时访问具有 2 个线程的数组的不同元素?
- 是否有用于元素部分移位的 simd 指令/内在/内置指令?
- 是否有具有外部元素分配的序列容器(在 STL 中)?
- C++:是否可以编写一个函数,将不同类型的元素附加到变体数组中?
- 数组对象的生存期是否在重用其元素存储时结束?
- 擦除是否删除 stl 无序列图元素使用的堆内存
- 调用 erase() 函数是否也会在擦除元素之前更改迭代器值?
- 是否有一个 std::set 函数来确定不超过数字 x 的最大元素?
- 除了 std::vector 之外,是否有一个 std 容器不会复制和销毁作为类的元素?
- 是否可以使用宏来访问动态数组或向量中的元素或为其赋值
- 如果我在相应 char 数组的声明中为其提供额外的元素,是否会自动设置 NULL?
- 使用 at() 访问 std::map 元素是否比运算符 [] 慢?