智能指针

智能指针

为什么需要智能指针?

手动 new / delete 容易出现内存泄漏、重复释放、悬空指针等问题。智能指针利用 RAII(资源获取即初始化)思想,在对象析构时自动释放堆内存。

三种智能指针

  • std::unique_ptr:独占所有权,不可拷贝、可移动。开销几乎为零,应作为首选。
  • std::shared_ptr:共享所有权,内部用引用计数管理,计数归零时释放。注意循环引用问题。
  • std::weak_ptr:不增加引用计数的"弱引用",用于观察 shared_ptr,可打破循环引用。

使用建议

  1. 能用 unique_ptr 就不用 shared_ptr。
  2. 需要共享才用 shared_ptr,并用 make_shared 创建(一次分配、异常安全)。
  3. 打破循环引用用 weak_ptr,如父子节点、观察者模式。

代码示例

#include <memory>
#include <iostream>

struct Node {
    std::shared_ptr<Node> next;
    std::weak_ptr<Node> prev;   // 用 weak_ptr 打破循环引用
    ~Node() { std::cout << "node destroyed\n"; }
};

int main() {
    auto a = std::make_shared<Node>();
    auto b = std::make_shared<Node>();
    a->next = b;
    b->prev = a;   // 若 prev 也用 shared_ptr 则两者永不释放
}

评论(0)

还没有评论,来抢沙发吧~