You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于std::vector中unique_ptr的delete操作与std::move使用的疑问

问题解答

1. std::vector<std::unique_ptr<GameState>>中delete m_gameStates.back()是否多余?

不仅多余,还会触发未定义行为。
std::unique_ptr是独占式智能指针,核心职责就是托管原始指针的生命周期:当unique_ptr对象被销毁时(比如vector::pop_back()移除最后一个元素,该unique_ptr会被析构),会自动调用delete释放它指向的GameState对象。
手动调用delete m_gameStates.back(),等于对同一个指针执行两次delete(一次手动,一次unique_ptr析构时自动执行),会引发双重释放,导致程序崩溃或其他不可预测的问题。正确做法是直接调用pop_back()即可,无需额外delete。

2. 复杂对象是否始终应使用std::move()而非拷贝?

不是绝对的,需结合场景判断:

  • 当你不再需要原对象时,优先用std::move():std::move()会转移对象的资源所有权,避免复杂对象深拷贝带来的高昂性能开销(比如拷贝大内存块、文件句柄等)。但要注意,被移动后的原对象会处于“有效但未定义”的状态,不能再依赖它的原有值。
  • 当需要保留原对象状态时,必须用拷贝:比如要保留原始数据副本,或者原对象是const类型(std::move()无法转移const对象的资源),此时只能选择拷贝。
  • 部分场景下拷贝更清晰:如果对象内存占用很小(即使逻辑复杂),拷贝的性能开销可忽略,这时用拷贝的代码可读性更高,没必要强行使用move。

3. 若vector改为存储原始指针,是否仍需手动执行delete?

是的,必须手动delete。
原始指针没有自动内存管理能力:vector的pop_back()或析构操作只会销毁指针本身(释放指针变量占用的内存),不会释放指针指向的GameState对象内存。如果不手动调用delete,这些对象会造成内存泄漏。
比如执行pop_back()前,需要先delete m_gameStates.back();再调用pop_back();若要清空整个vector,则需要遍历每个指针,逐个delete后再清空容器。

内容的提问来源于stack exchange,提问作者user63898

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 01:27:15