核心区别特性unique_ptrshared_ptr所有权独占所有权共享所有权引用计数无有线程安全拷贝❌ 禁止拷贝✅ 可以拷贝移动✅ 支持移动✅ 支持移动性能开销极低近乎原始指针较高引用计数开销内存占用和原始指针一样大是原始指针的2倍适用场景明确单一所有权多个对象共享资源1.unique_ptr- 独占所有权特点一个对象只能被一个unique_ptr拥有不能拷贝只能移动std::move析构时自动删除对象零开销和原始指针一样高效使用场景工厂模式返回对象容器中管理对象PIMPL 模式任何明确只有一个所有者的情况示例cpp#include memory #include iostream using namespace std; class Resource { public: Resource() { cout Resource created endl; } ~Resource() { cout Resource destroyed endl; } void use() { cout Resource used endl; } }; // ✅ 正确用法 void test_unique_ptr() { // 创建 unique_ptr auto ptr1 make_uniqueResource(); ptr1-use(); // ❌ 不能拷贝 // auto ptr2 ptr1; // 编译错误 // ✅ 可以移动所有权转移 auto ptr2 move(ptr1); ptr2-use(); // ptr1 现在为空 // 函数结束时自动释放 } // 工厂模式返回 unique_ptr unique_ptrResource createResource() { return make_uniqueResource(); // 移动语义高效 } // 在容器中使用 void test_container() { vectorunique_ptrResource vec; vec.push_back(make_uniqueResource()); vec.push_back(make_uniqueResource()); // 遍历需要引用 for (auto ptr : vec) { ptr-use(); } }2.shared_ptr- 共享所有权特点多个shared_ptr可以共享同一个对象引用计数记录有多少个shared_ptr指向对象引用计数为 0 时自动删除对象可以拷贝引用计数增加有性能开销维护引用计数使用场景多个对象需要共享同一资源观察者模式缓存系统复杂对象图示例cpp#include memory #include iostream using namespace std; class Resource { public: Resource() { cout Resource created endl; } ~Resource() { cout Resource destroyed endl; } void use() { cout Resource used endl; } }; void test_shared_ptr() { // 创建 shared_ptr auto ptr1 make_sharedResource(); cout 引用计数: ptr1.use_count() endl; // 1 // ✅ 可以拷贝引用计数增加 auto ptr2 ptr1; cout 引用计数: ptr1.use_count() endl; // 2 auto ptr3 ptr1; cout 引用计数: ptr1.use_count() endl; // 3 ptr2-use(); ptr3-use(); // ptr2 析构引用计数减为 2 // ptr3 析构引用计数减为 1 // ptr1 析构引用计数减为 0 → 删除对象 } // 观察者模式中使用 class Subject; class Observer { shared_ptrSubject _subject; // 共享主题 }; void test_shared_ptr_container() { vectorshared_ptrResource vec; vec.push_back(make_sharedResource()); vec.push_back(make_sharedResource()); // 可以拷贝 auto copy vec[0]; cout 引用计数: vec[0].use_count() endl; // 2 }3.weak_ptr- 配合shared_ptr使用特点不增加引用计数解决循环引用问题需要lock()获取shared_ptr可以检查对象是否还存在示例cpp#include memory #include iostream using namespace std; class Resource { public: Resource() { cout Resource created endl; } ~Resource() { cout Resource destroyed endl; } void use() { cout Resource used endl; } }; void test_weak_ptr() { auto shared make_sharedResource(); weak_ptrResource weak shared; // 不增加引用计数 cout 引用计数: shared.use_count() endl; // 1 // 使用 lock() 获取 shared_ptr if (auto ptr weak.lock()) { ptr-use(); // 安全使用 } shared.reset(); // 释放资源 // weak 已失效 if (auto ptr weak.lock()) { // 不会执行 } else { cout 资源已释放 endl; } }4. 如何选择决策树text需要共享所有权吗 ├─ 是 → 使用 shared_ptr │ └─ 需要解决循环引用 → 使用 weak_ptr └─ 否 → 使用 unique_ptr └─ 需要传递所有权 → 使用 move()具体场景场景推荐原因工厂模式返回对象unique_ptr明确唯一所有权容器中的对象unique_ptr独占所有权观察者模式shared_ptrweak_ptr多个观察者共享主题缓存系统shared_ptr多个消费者共享缓存树形结构unique_ptr子节点父节点拥有子节点图形对象图shared_ptrweak_ptr避免循环引用PIMPL 模式unique_ptr唯一所有权多线程共享shared_ptr线程安全的引用计数5. 完整对比示例cpp#include memory #include iostream #include vector using namespace std; class MyClass { public: MyClass(int v) : _value(v) { cout MyClass( _value ) created endl; } ~MyClass() { cout MyClass( _value ) destroyed endl; } int getValue() const { return _value; } private: int _value; }; // unique_ptr 示例 void unique_ptr_example() { cout \n unique_ptr 示例 endl; auto u1 make_uniqueMyClass(10); auto u2 make_uniqueMyClass(20); // u1-getValue(); // 10 // 移动所有权 auto u3 move(u1); // u1 现在为空 cout u3 value: u3-getValue() endl; // 10 // 容器中使用 vectorunique_ptrMyClass vec; vec.push_back(move(u2)); vec.push_back(move(u3)); // vec.push_back(u2); // ❌ 编译错误不能拷贝 cout vector size: vec.size() endl; } // shared_ptr 示例 void shared_ptr_example() { cout \n shared_ptr 示例 endl; auto s1 make_sharedMyClass(100); cout 引用计数: s1.use_count() endl; // 1 auto s2 s1; // 共享所有权 cout 引用计数: s1.use_count() endl; // 2 auto s3 s1; cout 引用计数: s1.use_count() endl; // 3 // 容器中使用可以拷贝 vectorshared_ptrMyClass vec; vec.push_back(s1); vec.push_back(s2); vec.push_back(s3); cout vector size: vec.size() endl; // 所有 shared_ptr 都有效 for (auto ptr : vec) { cout value: ptr-getValue() , refcount: ptr.use_count() endl; } } // 性能对比 void performance_comparison() { cout \n 性能对比 endl; cout sizeof(MyClass*) sizeof(MyClass*) bytes endl; cout sizeof(unique_ptrMyClass) sizeof(unique_ptrMyClass) bytes endl; cout sizeof(shared_ptrMyClass) sizeof(shared_ptrMyClass) bytes endl; } int main() { unique_ptr_example(); shared_ptr_example(); performance_comparison(); return 0; }总结特性unique_ptrshared_ptr用途独占所有权共享所有权拷贝❌✅移动✅✅引用计数❌✅性能最快较慢内存占用最小较大使用场景明确单一所有者多个所有者共享黄金法则默认使用unique_ptr只有需要共享时才用shared_ptr遇到循环引用时用weak_ptr打破