RAII(Resource Acquisition Is Initialization、日本語では「リソースの確保は初期化時に」、「リソースの取得と初期化」など)は、資源(リソース)の確保と解放を変数の初期化と破棄処理に結び付けるというプログラミングのテクニックで、特にC++とD言語で一般的である。RAIIでは資源の取得を変数の構築(初期化)時、返却を破壊時に行う。自動変数がスコープを離れるときデストラクタが呼ばれるため、変数の寿命が終わるとすぐに資源が返却されることが保障できるようになった。これは例外が起こったときでも同様であるため、RAIIは例外安全なコードを書くための鍵となる概念となった (Sutter 1999)。RAIIはよくマルチスレッドアプリケーションにおいてスレッドのロックの管理に用いられる。ほかにはファイル操作にも用いられ、標準C++ライブラリのファイルストリームでは、オブジェクトのコンストラクタでファイルストリームを開き、デストラクタで閉じる。C++ではオブジェクトをスタックに割り当てることが可能で、このようにC++のスコープの機構はファイルアクセスの管理に活用できる。後の例のようにRAIIは例外安全の達成にも活用される。RAIIを使えばあちこちにcodice_1-codice_2ブロックを用いることなくリソースリークを防げる。動的に確保されたメモリの所有権もRAIIで管理できる。この用途に標準C++ライブラリではcodice_3が用意されている。さらに、共有されるオブジェクトの生存期間は、C++の場合Boostのcodice_4(C++11ではcodice_5)・参照カウント方式、codice_6・侵入型参照カウント方式、Lokiのポリシーベースのcodice_7によって所有権を共有するという管理の仕方ができる。例外を送出しない関数OpenFileとCloseFileが与えられたとする。次のようにログファイルを開いたとする。このRAIIに則ったクラスは次のように使用できる。RAIIを使わない場合、ログ出力する関数は手動でファイルを管理しなければならない。この例は先と等価に書いたものである。LogFileとfunctionBの実装はOpenFileやCloseFileが例外を投げる可能性があった場合更に複雑になるが、functionAはそのような心配が不要である。LogFileではFILE_HANDLEをカプセル化したが、RAIIの真髄は有限の資源ならば何でも同様に管理できることにある。そして関数(やその他ブロック)を抜けるときに適切に資源が破棄されることがRAIIでは保障される。更にLogFileのインスタンスは(ファイルが開けなければ例外を投げるため)常に利用可能であると仮定してよい。RAIIを使わない場合、例外が発生するとある問題が生じる。functionBで、複数の資源が確保されているとして、それぞれの確保の間に例外が投げられたら、codice_2ブロックではどれを解放すべきかわからないのである(通常、確保されていない資源を解放することはできない)。RAIIならばこれにも対処できる。変数(メンバ変数も含む)が構築されたときとは逆順で破棄され、また完全に構築された(内部で例外が投げられずにコンストラクタが実行された)オブジェクトのみが破棄されるので問題は起こらない。functionBは初期値を無効と見なすことにしたりcodice_1-codice_2ブロックを重ねていったりするなど、状況に応じてコードを適切に書いていかなければfunctionAのような安全さは得られないのである。これはfunctionAが資源(またはそれに類するもの)の管理から逃れることができるようになったということである。いくつもの関数でLogFileを使っていれば、全体的にはコードが単純化し、コードの再利用もなっており、良いプログラムにする手助けとなっている。functionBはJavaのようなRAIIでない言語での資源管理に使われるイディオムに似ている。Javaのcodice_1-codice_12ブロックは資源の確実な返却を促すが、例えば全ての関数がLogFileを使うとしたら、その度にcodice_1-codice_12ブロックで適切に破棄処理を書かなければならず、プログラマに負担がかかる。RAIIをスマートポインタと呼ばれる類のクラスを使い、任意のリソース管理APIへ適用することも可能である。functionBを簡略化すると次のようになる。このコンポーネントは、(voidを含む)任意の型の解放関数を受け付け、0でない「ヌル」(無効)値(例えばINVALID_HANDLEが(INVALID_HANDLE)~0である場合など)を受け付ける(Windowsのように複数の呼出規約が用いられる環境では、どんなものでも受け付ける)。複数のインスタンスを同時に使っても問題ない。上の例と比べればcodice_2節がいくつも現れて混乱する事態からは逃れられる。最初のLogFileのようなRAIIクラスでは解放関数が失敗すると問題になる。C++では言語の制約上デストラクタから例外を投げるのは良い考えではない。そのためscoped_handleのようなクラスの利用は次のどちらかに当てはまるときには使うべきではない。RubyとSmalltalkは特別なスコープに関連付けられた変数の中にあるクロージャブロックという形でRAIIに対応している。以下はRubyの例である。C#とVB .NET 2005はC++デストラクタに代わるcodice_16インターフェイスを実装するクラスとcodice_17文を使ってRAIIに似た機能を実現している。Python 2.5に追加されたcodice_18ステートメントでは、同様の目的にcodice_19とcodice_20のメソッドを使う。
出典:wikipedia
LINEスタンプ制作に興味がある場合は、
下記よりスタンプファクトリーのホームページをご覧ください。