资源获取是用C语言初始化

Myn*_*cks 5 c gcc raii

问题是:您能否仅使用我在此问题底部提供的资源来帮助我更好地理解C语言(而非c ++)中的RAII宏?我试图在我的脑海中进行分析,以了解它的含义以及它的意义(在我看来这是没有意义的)。语法很难。问题的重点是:我在阅读和理解奇怪的语法及其在C语言中的实现方面遇到困难。 例如,我可以轻松阅读,理解和分析以下交换宏(对我来说很有意义):

#define myswap(type,A,B) {type _z; _z = (A); (A) = (B); (B) = _z;} 
Run Code Online (Sandbox Code Playgroud)

(以下内容摘自本书:了解C指针)

GNU编译器使用C语言提供了非标准扩展来支持RAII。

GNU扩展使用一个名为RAII_VARIABLE的宏。它声明一个变量并与该变量关联:

  • 一种
  • 创建变量时要执行的函数
  • 当变量超出范围时执行的函数

    宏如下所示:

    #define RAII_VARIABLE(vartype,varname,initval,dtor) \
    void _dtor_ ## varname (vartype * v) { dtor(*v); } \
    vartype varname __attribute__((cleanup(_dtor_ ## varname))) = (initval)
    
    Run Code Online (Sandbox Code Playgroud)

    例:

    void raiiExample() {
    RAII_VARIABLE(char*, name, (char*)malloc(32), free);
    strcpy(name,"RAII Example");
    printf("%s\n",name);
    } 
    
    int main(void){
        raiiExample();
    }
    
    Run Code Online (Sandbox Code Playgroud)

执行该功能时,将显示字符串“ RAII_Example”。不使用GNU扩展就可以达到类似的结果。

Jea*_*nès 4

当然,您可以在不使用 RAII 的情况下实现任何目标。RAII 用例不必考虑显式释放资源。像这样的模式:

void f() {
    char *v = malloc(...);
    // use v
    free v;
}
Run Code Online (Sandbox Code Playgroud)

需要你注意释放内存,否则就会出现内存泄漏。由于正确释放资源并不总是那么容易,RAII 为您提供了一种自动释放资源的方法:

void f() {
    RAII_VARIABLE(char*, v, malloc(...), free);
    // use v
}
Run Code Online (Sandbox Code Playgroud)

有趣的是,无论执行路径如何,资源都会被释放。因此,如果您的代码是意大利面条式代码,充满了复杂的条件和测试等,那么 RAII 可以让您释放释放的心思……