1. ホーム
  2. c

ピュアCでRAIIを実装する?

2023-11-19 07:10:20

質問

以下のような実装は可能でしょうか? RAII を純粋なC言語で実装することは可能でしょうか?

まともな方法では不可能だと思いますが、ある種の汚いトリックを使えば可能かもしれません。標準の free 関数をオーバーロードすることが思い浮かびます。あるいは、関数が戻ったときに、何らかの方法でリソースを解放する他の関数を呼び出すように、スタック上のリターンアドレスを上書きすることができますか? または、setjmp/longjmp のトリックを使用することもできますか?

これは純粋に学術的な興味であり、私は実際にそのような移植不可能で狂気のコードを書くつもりはありませんが、それが可能であるかどうか全く疑問に思っています。

どのように解決するのですか?

標準にはそのような可能性が含まれていないため、これは本質的に実装に依存します。GCCでは cleanup 属性は変数がスコープの外に出たときに関数を実行します。

#include <stdio.h>

void scoped(int * pvariable) {
    printf("variable (%d) goes out of scope\n", *pvariable);
}

int main(void) {
    printf("before scope\n");
    {
        int watched __attribute__((cleanup (scoped)));
        watched = 42;
    }
    printf("after scope\n");
}

印刷します。

before scope
variable (42) goes out of scope
after scope

参照 を参照してください。