1. 为什么需要智能指针与STL容器的组合?
在C++开发中,内存管理一直是个令人头疼的问题。传统裸指针(raw pointer)在STL容器中使用时,经常会遇到以下几个典型问题:
- 内存泄漏:当容器元素是裸指针时,clear()或erase()操作只会移除指针本身,不会释放指针指向的内存
- 悬垂指针:容器中的指针可能指向已被释放的对象
- 所有权模糊:无法明确指针所指向内存的生命周期由谁负责
我在实际项目中就遇到过这样的案例:一个存储图像处理结果的vector容器,当处理流程异常退出时,容器中指向图像数据的指针全部变成了内存泄漏点。后来改用shared_ptr后,即使程序异常终止,资源也能被正确释放。
智能指针通过RAII(Resource Acquisition Is Initialization)机制完美解决了这些问题。它们与STL容器结合使用时,能够:
- 自动管理容器元素的生命周期
- 明确内存所有权语义
- 提供异常安全保证
- 减少手动内存管理的错误
2. 三种智能指针在STL中的适用场景
2.1 unique_ptr:独占所有权的理想选择
unique_ptr代表独占所有权,是STL容器中最常用的智能指针类型。它的特点包括:
- 不可复制,但支持移动语义
- 零额外开销(与裸指针大小相同)
- 明确表达"唯一所有者"的设计意图
典型使用场景:
cpp复制std::vector<std::unique_ptr<Widget>> widgetList;
widgetList.push_back(std::make_unique<Widget>(...));
// 转移所有权
auto specialWidget = std::move(widgetList.back());
widgetList.pop_back();
注意事项:
- 不要尝试复制unique_ptr(编译错误)
- 使用std::move进行所有权转移
- 在C++14及以上版本优先使用make_unique
2.2 shared_ptr:共享所有权的解决方案
当需要多个容器或对象共享同一资源时,shared_ptr是最佳选择。它的特点:
- 使用引用计数管理生命周期
- 支持复制
