unique_ptr是C++中模拟Rust所有权最接近的工具,通过禁用拷贝、只允许移动来实现单一所有权和自动释放,但无borrow检查和lifetime保障。
unique_ptr 是 C++ 中模拟 Rust 所有权语义最接近的工具,但它不是 Rust 的“复制粘贴”,而是用移动语义(move semantics)在编译期强制实现单一所有权和自动释放——关键在于理解 移动即转移,拷贝被禁用 这一设计核心。
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 值类型)报错函数返回所有权、函数接收并接管所有权、跨作用域转移,都靠 std::move 显式表达意图:
std::unique_ptrcreate_foo() { return std::make_unique(); } (C++17 后允许直接返回,编译器自动移动)void consume(std::unique_ptrptr) { /* ptr 离开作用域时自动析构 */ }
if (condition) { owner = std::move(temp); } —— 类似 Rust 的 if let 或 take() 后再赋值C++ 的 unique_ptr 不提供 Rust 那样的借用(&T / &mut T)和生命周期标注。裸指针解引用(*ptr 或 ptr->method())仍可能空解引用或悬垂;Rust 编译器阻止的错误,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
Drop 更底层(无 move-only 类型系统保障),但配合 RAII 能达到相似的安全边界