std::unique_ptr std::unique_ptr 是 C11 引入的独占所有权智能指针它是现代 C 中管理动态内存的首选工具。一句话理解unique_ptr 专属管家对象只能有一个主人主人死了对象跟着销毁。1 最基本用法#includememory#includeiostreamstructFoo{Foo(intv):val(v){std::coutFoo constructed\n;}~Foo(){std::coutFoo destroyed\n;}intval;};intmain(){// ✅ 推荐使用 make_uniqueC14autopstd::make_uniqueFoo(42);std::coutp-valstd::endl;}// 自动析构 Foo2 核心特性不可复制只能移动1 不能复制autop1std::make_uniqueFoo(1);autop2p1;// ❌ 编译错误2 只能移动转移所有权autop1std::make_uniqueFoo(1);autop2std::move(p1);// 所有权转移// p1 现在是 nullptrif(!p1){std::coutp1 is null\n;}3 访问对象像裸指针一样autopstd::make_uniqueFoo(10);// 箭头操作符p-val20;// 解引用(*p).val30;// 判断是否持有对象if(p){std::coutHas object\n;}4 释放 / 重置 / 获取原始指针1 get() —— 获取原始指针⚠️不释放所有权Foo*rawp.get();// ❗不要 delete raw2 release() —— 释放所有权返回裸指针Foo*rawp.release();deleteraw;// 现在你必须自己管理3 reset() —— 销毁旧对象接管新对象p.reset();// 销毁对象p nullptrp.reset(newFoo(99));// 销毁旧的接管新的5 作为函数参数非常重要✅ 场景 1函数只是使用对象不接管voidprint(constFoo*f){if(f)std::coutf-valstd::endl;}print(p.get());✅ 场景 2函数接管所有权按值传参voidtakeOwnership(std::unique_ptrFooptr){std::coutptr-valstd::endl;}// ptr 离开作用域Foo 被销毁takeOwnership(std::move(p)); 经验法则只读​ → const Foo / const Foo*转移所有权​ → std::unique_ptr共享所有权​ → std::shared_ptr6 作为返回值天然推荐std::unique_ptrFoocreateFoo(){returnstd::make_uniqueFoo(123);}autopcreateFoo();// 零拷贝高效7 在类中使用工程级写法classEngine{public:explicitEngine(std::unique_ptrFoofoo):foo_(std::move(foo)){}private:std::unique_ptrFoofoo_;// 独占资源}; 好处明确所有权自动释放析构顺序可控不用手写析构函数