- 在构造函数中获取资源。
- 在析构函数中释放资源。
- 不直接操作资源,而是通过管理资源的对象来使用资源。
这样做有几个好处:
- 安全性:避免资源泄露。由于资源的释放是自动的,因此即使在异常发生时,对象的析构函数也会被调用,资源也相应地会被释放。
- 简洁性:代码通常更加简洁,因为资源的管理是自动的,不需要程序员显式编写资源释放代码。
- 异常安全:RAII可以帮助提供强异常安全保障,因为资源释放不依赖于程序路径。
在STL中,RAII广泛应用于各种容器和其他组件中。例如:
- 智能指针:
std::unique_ptr
和std::shared_ptr
是智能指针类,它们对动态分配的内存进行管理。当智能指针的实例离开作用域时,其析构函数会自动释放其所管理的内存。 - 容器类:如
std::vector
、std::string
、std::map
等,都负责自己内部数据的内存管理。当一个容器对象被销毁时,它的析构函数会释放所有占用的内存,并适当地销毁其元素。 - 锁管理类:如
std::lock_guard
和std::unique_lock
,它们在构造时获取锁,在析构时释放锁,从而确保在持有锁的代码块执行完毕后,无论是正常退出还是因异常退出,锁都会被释放。