1、 std::unique_ptr
std::unique_ptr
表示独占所有权的智能指针。一个 unique_ptr
只能有一个所有者,不能被复制,但可以通过 std::move
转移所有权。它确保了对象在 unique_ptr
超出作用域时自动销毁。
#include <memory> #include <iostream> class MyClass { public: void show() { std::cout << "Hello, world!" << std::endl; } }; int main() { std::unique_ptr<MyClass> ptr1(new MyClass()); ptr1->show(); // std::unique_ptr不能复制 // std::unique_ptr<MyClass> ptr2 = ptr1; // 编译错误 // 但是可以转移所有权 std::unique_ptr<MyClass> ptr2 = std::move(ptr1); ptr2->show(); // ptr1 不再拥有对象,ptr2 拥有对象 }
2、std::shared_ptr
std::shared_ptr
允许多个指针共享同一个对象的所有权。当最后一个 shared_ptr
被销毁时,对象才会被释放。这是通过引用计数实现的。
#include <memory> #include <iostream> class MyClass { public: void show() { std::cout << "Hello from shared_ptr!" << std::endl; } }; int main() { std::shared_ptr<MyClass> ptr1(new MyClass()); ptr1->show(); std::shared_ptr<MyClass> ptr2 = ptr1; // 共享所有权 ptr2->show(); // 当所有指向 MyClass 的 shared_ptr 被销毁时,对象自动释放 }
3、std::weak_ptr
std::weak_ptr
是一个不增加引用计数的智能指针,通常与 std::shared_ptr
一起使用。weak_ptr
用于解决 shared_ptr
中的循环引用问题。weak_ptr
只提供对对象的访问权限,但不管理对象的生命周期。
#include <memory> #include <iostream> class MyClass { public: void show() { std::cout << "Hello from weak_ptr!" << std::endl; } }; int main() { std::shared_ptr<MyClass> ptr1(new MyClass()); std::weak_ptr<MyClass> weakPtr = ptr1; // weak_ptr 不增加引用计数 std::shared_ptr<MyClass> ptr2 = weakPtr.lock(); // 将 weak_ptr 转换为 shared_ptr if (ptr2) { ptr2->show(); } else { std::cout << "对象已被销毁!" << std::endl; } // 当 ptr1 被销毁后,ptr2 会自动失效 }
4、智能指针的适用场景
使用 std::unique_ptr
当想要明确地拥有一个对象的所有权,并且不希望多个指针共享这个对象时,使用 std::unique_ptr
。它适用于资源独占的情况,如文件句柄、数据库连接等。
使用std::shared_ptr
当多个对象需要共享对同一资源的所有权时,使用 std::shared_ptr
。它适用于需要共享资源所有权的场景,如多个线程需要访问同一个共享对象。
使用std::weak_ptr
当你需要避免循环引用时,使用 std::weak_ptr
。例如,在父子关系中,父对象持有子对象的 shared_ptr
,而子对象持有父对象的 weak_ptr
,避免形成循环引用。