✅ 智能指针(推荐在大多数现代C++代码中使用)
适用于以下场景:
-
需要自动管理资源生命周期
避免手动
new/delete,由RAII机制自动释放。 -
防止内存泄漏
尤其在函数提前返回、循环嵌套等复杂控制流中。
-
管理复杂对象的所有权和生命周期
如
std::unique_ptr(独占所有权)、std::shared_ptr(共享所有权)、std::weak_ptr(打破循环引用)。 -
确保异常安全
即使发生异常,智能指针析构函数仍会正确释放资源,避免资源泄漏。
📌 典型例子:工厂函数返回对象、容器内存储多态基类指针、跨模块共享资源。
🔍 裸指针(仅在非常明确且受限的场景下使用)
适用于以下场景:
-
简单的、临时的、不涉及所有权的对象
例如函数内部对一个已存在对象的观察或访问(非拥有型指针)。
-
对性能开销要求极高的场景
智能指针(尤其是
shared_ptr)的控制块有额外内存和原子操作开销;裸指针无任何额外负担。 -
不需要管理资源生命周期的场景
仅用来传递或引用某块内存,而该内存由其它机制(如栈、全局、智能指针)负责释放。
⚠️ 警告:裸指针不表达所有权,必须确保其所指对象的寿命长于指针本身,否则会产生悬垂指针。
✨ 核心原则总结
| 维度 | 智能指针 | 裸指针 |
|---|---|---|
| 所有权 | 明确(独占/共享) | 无所有权(仅观察) |
| 生命周期管理 | 自动 | 手动(需保证对象有效) |
| 异常安全 | 安全 | 不安全(需额外编码) |
| 开销 | 有额外内存/CPU开销 | 几乎为零 |
| 推荐度 | 默认首选 | 仅限性能关键或极简单场景 |
💡 现代C++实践:优先使用智能指针表达所有权;仅在需要"非拥有型引用"或与旧C接口交互时使用裸指针。