Skip to content

RAII技术

隔壁有个:D:\Github\GitBook\gitbook\C++\RTTI.md

1、简介

如果程序在执行 join 前出现异常,然后线程将同样会出现错误。此时我们可能会考虑使用 try catch 语句来捕获代码异常,但是这种方式是不正确的,因为 try catch 仅能捕获轻量级别的异常,因此我们这里考虑使用资源获取即初始化 - RAII(Resource Acquisition Is Initialization)来处理。

Resource Acquisition Is Initialization 或 RAII,是一种 C++ 编程技巧,它绑定了在使用前必须获取的资源的生命周期(分配的堆内存、执行线程、打开的套接字、打开的文件、锁定的互斥锁、 磁盘空间、数据库连接——供应有限的任何东西)到对象的生命周期。

RAII是一种C++编程技术,全称为Resource Acquisition Is Initialization,中文翻译为“资源获取即初始化”。它的核心思想是:在对象的构造函数中获取资源,在对象的析构函数中释放资源。这种技术可以确保资源的正确获取和释放,避免了资源泄漏和错误使用的问题。RAII技术在C++中广泛应用,可以用于管理各种资源,如内存、文件、锁等。

2、作用域退出技术

ON_SCOPE_EXIT是一个宏,它定义了一个匿名的类,并在该类的析构函数中执行一些代码。在这种情况下,该类的析构函数会检查config指针是否为非空,如果是,则释放它所指向的内存,并将config指针设置为NULL。因此,当InitClasses函数结束时,无论是通过正常返回还是通过异常,都会自动调用该类的析构函数,从而释放config指向的内存。这种技术被称为“作用域退出”,可以确保在离开当前作用域时执行某些代码,从而避免内存泄漏等问题。

3、区别

不完全相同。虽然“作用域退出”和“资源获取即初始化”都是指在程序执行过程中某个特定时刻发生的事件,但它们的含义和用途略有不同。

“作用域退出”是指程序执行到某个代码块结尾时,该代码块中定义的变量会被销毁,其占用的内存空间会被释放。这个过程是自动发生的,无需程序员手动干预。作用域退出的主要作用是确保程序的内存使用效率,避免内存泄漏等问题。

“资源获取即初始化”是指在程序执行过程中,当某个对象被创建时,它所需要的资源(如内存、文件句柄等)会被立即获取并初始化。这个过程通常需要程序员手动编写代码来实现。资源获取即初始化的主要作用是确保程序在使用资源时能够及时获取并释放,避免资源泄漏等问题。

因此,虽然“作用域退出”和“资源获取即初始化”都与程序执行过程中的某个时刻有关,但它们的含义和作用略有不同。

当一个函数执行完毕后,其中定义的变量和函数都会被销毁,这些变量和函数的作用域就是该函数的作用域。作用域退出指的是当函数执行完毕后,其中定义的变量和函数的作用域被销毁的过程。

资源获取即初始化是指在程序运行时,为变量或对象分配内存空间,并对其进行初始化的过程。这个过程可以在变量或对象被定义时进行,也可以在程序运行时进行。

作用域退出和资源获取即初始化的区别在于,作用域退出是指变量和函数的作用域被销毁的过程,而资源获取即初始化是指为变量或对象分配内存空间并进行初始化的过程。作用域退出是一个语言特性,而资源获取即初始化是一个编程概念。

4、实战

代码见:D:\Github\Storage\c++\study\RAII\scope_guard.cpp D:\Github\Storage\c++\study\RAII\README.md

This website is released under the MIT License.