unique_ptr是C++中模拟Rust所有权最接近的工具,通过禁用拷贝、只允许移动来实现单一所有权和自动释放,但无borrow检查和lifetime保障。

unique_ptr 是 C++ 中模拟 Rust 所有权语义最接近的工具,但它不是 Rust 的“复制粘贴”,而是用移动语义(move semantics)在编译期强制实现单一所有权和自动释放——关键在于理解 移动即转移,拷贝被禁用 这一设计核心。
Rust 所有权在 C++ 中的对应点
Rust 中变量绑定拥有值、赋值/传参即转移所有权、禁止浅拷贝;C++ 的 unique_ptr 通过删除拷贝构造函数和拷贝赋值运算符,只保留移动构造和移动赋值,达成类似效果:
- 声明时获得唯一所有权:
auto p = std::make_unique(42); - 转移所有权必须显式移动:
auto q = std::move(p);—— 此后p变为空(p == nullptr),q持有原对象 - 直接赋值或传值会编译失败:
auto r = p;或func(p)(若参数是unique_ptr值类型)报错
模拟 Rust 的常见场景写法
函数返回所有权、函数接收并接管所有权、跨作用域转移,都靠 std::move 显式表达意图:
- 返回所有权:
std::unique_ptr(C++17 后允许直接返回,编译器自动移动)create_foo() { return std::make_unique (); } - 接收所有权:
void consume(std::unique_ptrptr) { /* ptr 离开作用域时自动析构 */ } - 条件转移:
if (condition) { owner = std::move(temp); }—— 类似 Rust 的if let或take()后再赋值
注意差异:没有 borrow,也没有 lifetime 检查
C++ 的 unique_ptr 不提供 Rust 那样的借用(&T / &mut T)和生命周期标注。裸指针解引用(*ptr 或 ptr->method())仍可能空解引用或悬垂;Rust 编译器阻止的错误,C++ 需靠程序员自律或辅助手段:
立即学习“C++免费学习笔记(深入)”;
- 访问前检查:
if (ptr) { ... } - 避免长期保存裸指针或引用:
Foo* raw = ptr.get();后不能假设它一直有效 - 需要共享语义时,改用
std::shared_ptr(但这就偏离了 Rust 的单一所有权模型)
进阶:自定义删除器与资源封装
像 Rust 的 Drop trait,unique_ptr 支持自定义删除逻辑,可封装文件句柄、锁、GPU 资源等:
using FilePtr = std::unique_ptr; ,>-
FilePtr f(fopen("x.txt", "r"), &fclose);—— 离开作用域自动调用fclose - 这比 Rust 的
Drop更底层(无 move-only 类型系统保障),但配合 RAII 能达到相似的安全边界









