
智能指针和内存管理

智能指针与内存管理
RAII和引用计数
引用计数:防止内存泄漏,不是垃圾回收引用计数能够尽快收回不再被使用的对象,同时在回收的过程中也不会造成长时间的等待,能够清晰明确的表明资源的声明周期
RAII(Resource Acquisition Is Initialization)用于管理资源的生命周期;核心思想是利用对象生命周期来管理资源,确保资源总是在控制范围内得到适当的处理
- 资源的自动管理:资源在对象构造时获取,在析构时释放,这简化了资源管理
- 异常安全:通过自动销毁管理资源的对象,RAII能够提供异常安全保证,即使在异常抛出时也能正确释放资源
- 防止资源泄漏:自动释放资源减少了内存泄漏或其他资源泄漏的风险
应用场景:
- 动态内存管理:使用智能指针管理动态分配的内存
- 文件和网络资源管理:自动关闭文件句柄和网络连接
- 锁和同步机制:在多线程编程中,利用RAII来自动释放锁
std::shared_ptr
能够记录多少个shared_ptr
共同指向一个对象,从而消除显式调用delete
,当引用计数变为0时就会将对象自动删除
std::unique_ptr
unique_ptr
是一种独占的智能指针,禁止其他智能指针与其共享同一个对象
既然是独占,也就是不可复制,可以利用std::move将其转移给其他的unique_ptr
std::weak_ptr
考虑到下面这个shared_ptr
无法解决的问题
1 | struct A; |
两个对象均不会被销毁,a b内部的pointer同时引用了a b,这使得a b的引用计数均变为2
使用弱引用指针std::weak_ptr