std::shared_ptr 介绍
std::shared_ptr
是 C++11 引入的智能指针之一,用于管理动态分配对象的生命周期,通过引用计数机制实现共享所有权。
基本特性
-
共享所有权:多个
shared_ptr
可以共同拥有同一个对象 -
自动释放:当最后一个
shared_ptr
被销毁时,它所管理的对象会被自动删除 -
线程安全:引用计数操作是原子操作,线程安全(但管理的对象本身不是线程安全的)
#include <memory> #include <iostream> class MyClass { public: MyClass() { std::cout << "MyClass constructed\n"; } ~MyClass() { std::cout << "MyClass destroyed\n"; } void doSomething() { std::cout << "Doing something\n"; } }; int main() { // 创建 shared_ptr std::shared_ptr<MyClass> ptr1(new MyClass()); // 使用 make_shared 更高效(推荐方式) auto ptr2 = std::make_shared<MyClass>(); // 共享所有权 std::shared_ptr<MyClass> ptr3 = ptr2; // 使用指针 ptr1->doSomething(); (*ptr2).doSomething(); // 获取原始指针(谨慎使用) MyClass* rawPtr = ptr3.get(); // 重置指针 ptr1.reset(); // 释放所有权 // 检查是否有所有权 if (ptr1) { std::cout << "ptr1 owns an object\n"; } else { std::cout << "ptr1 is empty\n"; } return 0; // ptr2 和 ptr3 离开作用域,对象被自动销毁 }
注意事项
-
避免循环引用:可能导致内存泄漏,可使用
std::weak_ptr
解决
class B; class A { std::shared_ptr<B> b_ptr; }; class B { std::shared_ptr<A> a_ptr; // 循环引用 };
优先使用 make_shared:更高效(单次内存分配),且更安全
auto p = std::make_shared<int>(42); // 推荐
-
不适用于数组(C++17 前):管理数组应使用
std::shared_ptr<T[]>
(C++17)或std::vector
std::shared_ptr
是 C++ 中管理动态内存的强大工具,正确使用可以大大减少内存泄漏的风险。