ファイナライザと自動変数
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/03/16 02:54 UTC 版)
「C++/CLI」の記事における「ファイナライザと自動変数」の解説
そのほかの変化として、C++/CLIではガベージコレクション時に実行されるファイナライザの構文が!クラス名()となったことが挙げられる。そして~クラス名()は従来のC++と同じ意味のデストラクタとなった。さらに、下の例にあるような新しい構文では、従来のC++と同じくデストラクタは自動的に呼ばれる。共通中間言語 (CIL) 上では、C++/CLIのデストラクタはIDisposableインターフェイスのDisposeメソッドとして実装される。C++/CLIコンパイラがそのようにコンパイルする。このためC++/CLIでも引き続きRAIIが可能である。 // C++/CLI// デストラクタを定義すると、IDisposableを明示的に指定しなくても、コンパイラが自動的にIDisposableを実装すると判断する。ref class MyClass // : IDisposable{public: MyClass() {} // コンストラクタ。 ~MyClass() {} // デストラクタ。コンパイラによってIDisposable::Dispose()に変換される。 static void Test() { { MyClass x; // ハンドルでなく初期化子も無い:コンパイラがコンストラクタを呼ぶ。 x.ToString(); // コンパイラはブロック全体を包むfinallyを作り、その中で自動変数xのデストラクタを呼ぶコードを自動生成する。 } MyClass^ user; try { user = gcnew MyClass(); user->ToString(); } finally { delete user; } }protected: !MyClass() {} // ファイナライザ。Object::Finalize()を直接オーバーライドすることはできない。マネージ拡張C++ではvirtual void Finalize()という構文だった。}; // C#class MyClass : IDisposable{ public MyClass() {} // コンストラクタ。 ~MyClass() {} // ファイナライザ(旧称デストラクタ)。Object.Finalize()を直接オーバーライドすることはできない。 public void Dispose() {} // IDisposable.Dispose() メソッドの実装。 public static void Test() { using (MyClass x = new MyClass()) { x.ToString(); } // コンパイラはusingブロックを抜けるときにx.Dispose()を必ず呼ぶコードを自動生成する。 // つまり以下のコードに等しい。 MyClass user; try { user = new MyClass(); user.ToString(); } finally { if (user != null) user.Dispose(); } }}
※この「ファイナライザと自動変数」の解説は、「C++/CLI」の解説の一部です。
「ファイナライザと自動変数」を含む「C++/CLI」の記事については、「C++/CLI」の概要を参照ください。
- ファイナライザと自動変数のページへのリンク