【C++】RAll--C++ 中最厉害的编程范式(小白一看就懂!!)

目录

一、前言

二、RAll的核心概念 

三、典型应用 

代码示例

四、RAII 的优点 

五、典型 RAII 类

六、总结

七、共勉 


一、前言

RAIIResource Acquisition Is Initialization资源获取即初始化)是一种在 C++ 中常见的编程范式,主要用于管理资源(如动态内存文件句柄网络连接等)。其核心思想是将资源的生命周期绑定到对象的生命周期,通过对象的构造函数来获取资源,通过对象的析构函数来释放资源。这种方式避免了显式的资源管理,减少了资源泄漏的可能性。

二、RAll的核心概念 

  • 资源获取即初始化资源的分配与对象的初始化绑定在一起资源的释放与对象的销毁绑定在一起。
  • 自动释放资源:当对象超出作用域(scope)时,系统自动调用其析构函数,从而释放所占用的资源。这可以避免忘记释放资源或者手动释放资源时出现错误。

三、典型应用 

RAII 常用于以下资源管理:

  • 内存管理:通过智能指针(如 std::unique_ptrstd::shared_ptr)自动管理堆内存。
  • 文件管理:通过 std::fstream 自动管理文件的打开和关闭。
  • 互斥锁管理:通过 std::lock_guardstd::unique_lock 自动管理锁的获取和释放。

代码示例

下面是一个使用 RAII 管理文件资源的简单例子:

#include <iostream>
#include <fstream>

void readFile(const std::string& fileName) {
    // 文件在构造时打开,在析构时关闭
    std::ifstream file(fileName); 

    if (!file.is_open()) {
        std::cerr << "Failed to open the file." << std::endl;
        return;
    }

    std::string line;
    while (std::getline(file, line)) {
        std::cout << line << std::endl;
    } // 文件在作用域结束时自动关闭
}

int main() {
    readFile("example.txt");
    return 0;
}

使用 RAII 管理互斥锁 

#include <iostream>
#include <thread>
#include <mutex>

std::mutex mtx;

void printThreadID(int id) {
    // 使用 std::lock_guard 自动管理互斥锁
    std::lock_guard<std::mutex> lock(mtx);
    std::cout << "Thread " << id << " is running." << std::endl;
}

int main() {
    std::thread t1(printThreadID, 1);
    std::thread t2(printThreadID, 2);

    t1.join();
    t2.join();

    return 0;
}
  • 在这个例子中,std::lock_guard 是 RAII 的一个实现,它在构造时锁住互斥量,在析构时自动解锁。这样保证了即使在异常或提前返回时,锁也会正确释放,避免死锁。 

 使用 RAII 管理内存

#include <iostream>
#include <memory> // 包含智能指针的头文件

class MyClass {
public:
    MyClass(int val) : value(val) {
        std::cout << "MyClass constructor: " << value << std::endl;
    }
    ~MyClass() {
        std::cout << "MyClass destructor: " << value << std::endl;
    }
    void display() const {
        std::cout << "Value: " << value << std::endl;
    }
private:
    int value;
};

int main() {
    // 创建一个 unique_ptr,自动管理 MyClass 的内存
    std::unique_ptr<MyClass> myPtr(new MyClass(42));
    
    myPtr->display(); // 调用成员函数

    // myPtr 超出作用域后,自动释放内存
    return 0;
}
  • 创建 std::unique_ptr

    • 使用 std::unique_ptr<MyClass> 创建一个智能指针 myPtr,并动态分配一个 MyClass 对象。
  • 自动释放内存

    • myPtr 超出作用域时,MyClass 的析构函数会被自动调用,内存会被释放,不需要手动调用 delete

四、RAII 的优点 

  • 资源安全释放:通过将资源管理放在对象的析构函数中,RAII 保证了资源的释放,即使发生异常,也不会造成资源泄漏。
  • 简化代码:开发者不再需要手动管理资源的分配与释放,减少了代码的复杂性和出错的可能性。
  • 异常安全:由于析构函数会在对象销毁时自动调用,RAII 机制可以确保在异常发生时资源得到正确释放。

五、典型 RAII 类

  • 智能指针(std::unique_ptrstd::shared_ptr:管理动态分配的内存,自动释放不再使用的对象。
  • 文件流类(std::ifstreamstd::ofstream:自动管理文件的打开和关闭。
  • 互斥锁类(std::lock_guardstd::unique_lock:自动管理线程的锁定和解锁。

六、总结

RAII 是 C++ 中管理资源的重要原则,通过将资源的获取与对象的生命周期绑定在一起,RAII 可以有效防止资源泄漏,并提高代码的可维护性和异常安全性。这一思想广泛应用于内存管理、文件操作、线程同步等场景。

七、共勉 

以下就是我对 【C++】RAll 的理解,如果有不懂和发现问题的小伙伴,请在评论区说出哦,同时我还会继续更新【C++】,请持续关注我哦!!!   

猜你喜欢

转载自blog.csdn.net/weixin_45031801/article/details/142737361