智能指针
智能指针
为什么需要智能指针?
手动 new / delete 容易出现内存泄漏、重复释放、悬空指针等问题。智能指针利用 RAII(资源获取即初始化)思想,在对象析构时自动释放堆内存。
三种智能指针
std::unique_ptr:独占所有权,不可拷贝、可移动。开销几乎为零,应作为首选。std::shared_ptr:共享所有权,内部用引用计数管理,计数归零时释放。注意循环引用问题。std::weak_ptr:不增加引用计数的"弱引用",用于观察shared_ptr,可打破循环引用。
使用建议
- 能用
unique_ptr就不用shared_ptr。 - 需要共享才用
shared_ptr,并用make_shared创建(一次分配、异常安全)。 - 打破循环引用用
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)
还没有评论,来抢沙发吧~