RAII机制

RAII是一种C++编程中的资源管理技术,通过在对象构造时获取资源并在析构时自动释放,确保资源的有效性和避免内存泄漏。这种方式简化了复杂程序中的资源管理,特别是在异常处理中,能保证资源的正确释放。文章通过手动和自动销毁资源的示例对比,阐述了RAII的工作原理和优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RAII机制介绍

RAII(Resource Acquisition Is Initialization)是由c++之父Bjarne Stroustrup提出的,中文翻译为资源获取即初始化,他说:使用局部对象来管理资源的技术称为资源获取即初始化;这里的资源主要是指操作系统中有限的东西如内存、网络套接字等等,局部对象是指存储在栈的对象,它的生命周期由编译器管理,无需人工介入。

RAII是C++语法体系中的一种合理管理资源避免出现内存泄漏的常用方法。以对象管理资源,利用的就是C++构造的对象最终会被对象的析构函数销毁的原则。

RAII原理

资源的使用一般经历三个步骤:

  1. 获取资源
  2. 使用资源
  3. 销毁资源

RAII的做法是使用一个对象,在其构造时获取对应的资源,在对象生命期内控制对资源的访问,使之始终保持有效,最后在对象析构的时候,释放构造时获取的资源。当定义的局部变量的生命结束时,它的析构函数就会自动的被调用,如此,就不用程序员显示的去调用释放资源的操作了。

使用RAII机制的原因

资源的销毁往往是程序员经常忘记的一个环节,RAII可以让资源自动销毁,避免出现内存泄漏。

RAII机制的优点

  1. 自动释放资源
  2. 对象所需的资源只在其生命期内始终保持有效

手动销毁资源的例子:

#include <iostream>
using namespace std;
int main(){
	int *p = new int [5];
	delete [] p;
	p = nullptr;
	
	system("pause");
	return 0;
}

上述的的申请、使用、释放资源的程序较为简单,当程序很复杂时,需要把所有new分配的内存delete掉,导致代码臃肿,降低程序的可理解性和可维护性。当操作增多时,处理资源释放的代码就会越来越多,越来越乱。

如果某一个操作发生了异常而导致释放资源的语句没有被调用,怎么办?这个时候,RAII机制就可以派上用场了。

自动销毁资源的例子:

#include <iostream>
using namespace std;
class person {
  public:
      person(const std::string name = "", int age = 0) : 
      name_(name), age_(age) {
            std::cout << "Init a person!" << std::endl;
      }
      ~person() {
            std::cout << "Destory a person!" << std::endl;
      }
      const std::string& getname() const {
            return this->name_;
      }    
      int getage() const {
            return this->age_;
      }      
  private:
      const std::string name_;
      int age_;  
};
int main() {
    person p;
    return 0;
}

当我们在main函数中声明一个局部对象的时候,会自动调用构造函数进行对象的初始化,当整个main函数执行完成后,自动调用析构函数来销毁对象。

RAII步骤总结

  1. 设计一个类封装资源
  2. 在构造函数中初始化
  3. 在析构函数中执行销毁操作
  4. 使用时声明一个该类的对象

RAII的应用

  • 封装多线程的互斥锁
  • 管理资源
  • 利用RAII过程等待线程完结
  • 等等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值