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

如何将unique_ptr指向的对象移入vector且不执行复制操作?

关于std::unique_ptr对象移入std::vector的问题解答

1. std::move(*fooPtr)是否实现无复制移入?

完全符合预期,这个操作会将fooPtr指向的Foo对象移动到vector中,而非复制:

  • 调用push_back(std::move(*fooPtr))时,会触发Foo的移动构造函数(无自定义实现时,编译器会生成默认版本),直接将原对象的资源转移给vector内新建的Foo实例。
  • 整个过程不会执行复制操作,达到了你要求的“无复制移入”效果。

2. 操作后持有fooPtr是否安全?

fooPtr本身是有效的智能指针,不会因移动操作失效,但它指向的原Foo对象已处于被移动后的特殊状态:

  • 根据C++标准,被移动后的对象必须满足“可析构、可赋值”的要求,但原有业务状态(如成员变量值、持有的资源)不保证可用。
  • 若使用编译器生成的默认移动构造函数:
    • 内置类型成员的数值会保留,但逻辑上已不属于原对象;
    • 带资源的成员(如std::unique_ptr)会被置为空状态。
  • 若自定义了Foo的移动构造函数,原对象状态取决于你的实现逻辑,通常会将其置为安全的默认/空状态。

3. 后续处理建议

既然你之后不再需要该指针,建议在移动操作后调用fooPtr.reset(),手动释放原对象内存,避免误访问被移动后的原对象引发未定义行为;也可以让fooPtr自然离开作用域,智能指针会自动完成析构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 07:40:32