如何将持有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
相关产品推荐
相关产品推荐

