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

如何将持有CDialogEx的std::unique_ptr加入std::vector避免删除函数引用错误

解决std::unique_ptr插入std::vector时的删除函数引用错误

问题原因

std::unique_ptr是独占式智能指针,它的拷贝构造函数被显式删除——这是为了保证同一时间只有一个unique_ptr持有对象所有权。你调用insert时直接传入upm_dlg1,会触发编译器尝试拷贝这个unique_ptr,违反了它的独占语义,因此报出“引用已删除函数”的错误。

解决方案

有两种直接有效的解决方式:

1. 用std::move转移所有权

修改插入代码,通过std::move把unique_ptr的所有权转移给容器:

m_dlgs.insert(it, std::move(upm_dlg1));

注意:执行该操作后,原变量upm_dlg1会变成空指针,不再持有任何对象的所有权,符合unique_ptr的设计逻辑。

2. 直接在插入时构造unique_ptr

如果不需要保留原unique_ptr变量,可以直接在insert调用里构造对象,跳过中间变量:

m_dlgs.insert(it, std::make_unique<SignPage>());

这种方式更简洁,也避免了所有权转移的额外操作。

容器选择建议

std::vector完全满足你“支持插入、删除”的需求:

  • 如果你只是偶尔在头部/尾部或中间插入删除,vector的缓存友好性(连续内存)会带来更好的性能;
  • 如果你需要频繁在任意位置执行插入删除,可以考虑std::list(双向链表),但它的随机访问效率不如vector,需要根据实际场景权衡。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 06:55:00