智能指针(Smart Pointer)是C++标准库中的一种模板类,用于自动管理动态分配的内存,以避免内存泄漏和悬挂指针等问题。智能指针通过RAII(Resource Acquisition Is Initialization)机制,在对象生命周期结束时自动释放资源。C++11标准引入了三种主要的智能指针:std::unique_ptr
、std::shared_ptr
和std::weak_ptr
。
- 特点:独占所有权,不能复制,只能移动。
- 用途:适用于一个对象只能有一个所有者的场景。
- 示例:
#include <memory> std::unique_ptr<int> ptr1(new int(10)); std::unique_ptr<int> ptr2 = std::move(ptr1); // ptr1 失去所有权,ptr2 获得所有权
- 特点:共享所有权,可以复制,使用引用计数来管理资源。
- 用途:适用于多个对象共享同一资源的场景。
- 示例:
#include <memory> std::shared_ptr<int> ptr1(new int(10)); std::shared_ptr<int> ptr2 = ptr1; // ptr1 和 ptr2 共享所有权
-
特点:弱引用,不影响引用计数,防止循环引用。
-
用途:通常与
std::shared_ptr
配合使用,用于解决循环引用问题。 -
示例:
#include <iostream> #include <memory> class Node { public: std::shared_ptr<Node> next; std::weak_ptr<Node> prev; // 使用 weak_ptr 打破循环引用 ~Node() { std::cout << "Node destroyed" << std::endl; } }; int main() { auto node1 = std::make_shared<Node>(); auto node2 = std::make_shared<Node>(); node1->next = node2; node2->prev = node1; // 使用 weak_ptr return 0; }
在这个例子中,
node1
和node2
互相引用,但由于prev
使用的是std::weak_ptr
,不会增加引用计数,从而避免了循环引用。
智能指针通过自动管理内存的分配和释放,极大地减少了手动管理内存带来的复杂性和错误。选择合适的智能指针类型可以提高代码的安全性和可维护性。