unique_ptr不可拷贝只能移动,需用std::move转移所有权;推荐std::make_unique创建,异常安全;数组须用特化版本;函数传参优先按值移动或裸指针/引用。
unique_ptr 不能被拷贝,只能移动
这是最常踩的坑:直接写 std::unique_ptr<int> p2 = p1;</int> 会编译失败,报错类似 use of deleted function。因为 unique_ptr 的拷贝构造函数和拷贝赋值运算符都被显式删除了,它只允许转移所有权。
正确做法是用 std::move 显式转移:
std::unique_ptr<int> p1 = std::make_unique<int>(42); std::unique_ptr<int> p2 = std::move(p1); // p1 现在为空,p2 持有资源
注意:p1 被移动后变成空指针(p1 == nullptr),再解引用会崩溃。
make_unique 是首选创建方式,别手动 new
用 new 配合 unique_ptr 构造函数容易出异常安全问题。比如 std::unique_ptr<foo>(new Foo(a, b))</foo> 中,若 Foo 构造抛异常,new 分配的内存就泄露了。
立即学习“C++免费学习笔记(深入)”;
std::make_unique 是异常安全的,且更简洁:
-
std::make_unique<int>()</int>→ 初始化为 0 -
std::make_unique<int>(123)</int>→ 初始化为 123 -
std::make_unique<:string>("hello")</:string>→ 正确转发参数
例外:需要自定义删除器时,仍需显式构造,例如 std::unique_ptr<int void>{new int, [](int* p){ delete p; }}</int>。