选智能指针应依据资源所有权设计:1. unique_ptr用于独占资源,轻量且禁拷贝;2. shared_ptr用于共享资源,需防循环引用;3. 裸指针仅作观察,所有权必须统一清晰。

选智能指针不是看哪个“高级”,而是看资源所有权怎么分——谁该拥有、能否共享、是否需要转移,这三点理清了,unique_ptr 和 shared_ptr 就不会用混。
用 unique_ptr:资源只能有一个主人
当你确定某块内存(或文件句柄、socket等)在任意时刻只属于一个对象,且不打算把它“借出去”或“复制给别人”,unique_ptr 就是首选。它轻量(无引用计数开销)、移动语义明确、析构自动,还禁止拷贝——这些都在帮你守住“独占”契约。
- 函数返回动态对象?直接返回
unique_ptr,所有权自然移交,不用 new + 手动 delete - 类成员管理私有资源?用
unique_ptr替代裸指针,构造/析构自动对齐,异常安全 - 容器里存一堆动态对象?
vector比> vector安全得多,清空容器即释放全部资源
用 shared_ptr:多个地方需要“共同拥有”同一份资源
当不同模块、不同生命周期的对象都需要访问同一块资源,并且谁都无法单方面决定它何时销毁(比如观察者模式里的被观察对象、缓存中的共享数据、异步任务中跨线程传递的上下文),这时才轮到 shared_ptr 出场。
- 注意循环引用:两个
shared_ptr相互持有(如父子节点、回调绑定),会导致引用计数永远不归零;改用weak_ptr打断环 - 避免从裸指针反复构造:
shared_ptr不安全,推荐(new T) make_shared—— 一次分配、更高效、异常安全() - 不要把
shared_ptr当作“懒人 delete”滥用;它带运行时开销(原子计数、控制块内存),不该用来替代本该独占的场景
别用 raw pointer 管理所有权,也别混用智能指针和裸指针接管同一资源
int* p = new int(42); shared_ptr 是危险操作——裸指针可能被提前 delete,或者被另一个 shared_ptr 二次接管,引发未定义行为。所有权必须统一、清晰、无歧义。
立即学习“C++免费学习笔记(深入)”;
- 裸指针只用于“观察”或“临时访问”:函数参数、返回值(非所有权)、迭代器内部实现等
- 一旦涉及 new / malloc / fopen / CreateFile 等资源获取,立刻交给智能指针(或 RAII 封装类)
- 第三方库返回裸指针?查文档确认所有权归属;若它声称“你负责释放”,就用
unique_ptr+ 自定义 deleter 接管
基本上就这些。不复杂,但容易忽略——关键不在语法,而在设计时想清楚:这份资源,到底归谁管?能分给别人吗?什么时候放手?想清楚了,unique_ptr 和 shared_ptr 就各司其职,内存管理反而变得踏实。










