智能指针和内存管理

智能指针和内存管理

fetch150zy

智能指针与内存管理

RAII和引用计数

引用计数:防止内存泄漏,不是垃圾回收引用计数能够尽快收回不再被使用的对象,同时在回收的过程中也不会造成长时间的等待,能够清晰明确的表明资源的声明周期

RAII(Resource Acquisition Is Initialization)用于管理资源的生命周期;核心思想是利用对象生命周期来管理资源,确保资源总是在控制范围内得到适当的处理

  1. 资源的自动管理:资源在对象构造时获取,在析构时释放,这简化了资源管理
  2. 异常安全:通过自动销毁管理资源的对象,RAII能够提供异常安全保证,即使在异常抛出时也能正确释放资源
  3. 防止资源泄漏:自动释放资源减少了内存泄漏或其他资源泄漏的风险

应用场景:

  • 动态内存管理:使用智能指针管理动态分配的内存
  • 文件和网络资源管理:自动关闭文件句柄和网络连接
  • 锁和同步机制:在多线程编程中,利用RAII来自动释放锁

std::shared_ptr

能够记录多少个shared_ptr共同指向一个对象,从而消除显式调用delete,当引用计数变为0时就会将对象自动删除

std::unique_ptr

unique_ptr是一种独占的智能指针,禁止其他智能指针与其共享同一个对象

既然是独占,也就是不可复制,可以利用std::move将其转移给其他的unique_ptr

std::weak_ptr

考虑到下面这个shared_ptr无法解决的问题

1
2
3
4
5
6
7
8
9
10
11
12
13
struct A;
struct B;
struct A {
std::shared_ptr<B> pointer;
};
struct B {
std::shared_ptr<A> pointer;
};
// use
auto a = std::make_shared<A>();
auto b = std::make_shared<B>();
a->pointer = b;
b->pointer = a;

两个对象均不会被销毁,a b内部的pointer同时引用了a b,这使得a b的引用计数均变为2

使用弱引用指针std::weak_ptr