オブジェクト指向プログラミングにおいて、オブジェクトが破棄されるときに自動的に呼び出され、オブジェクトが使用していたリソースを返却するなどの終了処理を行うメソッドのことです。
具体的な仕様はプログラミング言語による違いがありますが、そもそもデストラクタを備えていない言語も多くあります。C++ の場合は、クラスの名前の頭に ~
を付加した名前のメンバ関数をクラス定義の中に記述します。引数や戻り値は存在しません。本体には、呼び出されたあとに実行する一連のコードを、通常のメンバ関数と同じように記述します。
C++ のデストラクタについては、C++編【言語解説】第13章で解説しています。
デストラクタは、オブジェクトが破棄されるときに自動的に呼び出されます。つまり、自動記憶域期間をもつオブジェクトならばスコープを抜けるとき、静的記憶域期間をもつオブジェクトならばプログラムが終了する直前、動的記憶域期間をもつオブジェクトならば解放の処理を実行したときが、デストラクタが呼び出されるタイミングです。
デストラクタの実行後に、そのオブジェクトが使用していたメモリ領域が解放されます。
C++ では、メモリ領域を解放する部分についても、operator delete を定義することで記述可能です。C++編【言語解説】第36章で解説しています。
デストラクタの使用用途として、そのオブジェクトが、ダイナミックアロケーションによって確保していたメモリ領域を解放したり、ストリームをクローズしたりといった、リソースの後片付けがあります。必ずしも後片付けだけに使われなければならないわけではなく、参照カウントの実装や、ロギングのために使うこともあります。C++ はリソースの解放にプログラマーが責任を持たなければならない言語仕様ですが、デストラクタは例外が発生した場合も含め、確実に呼びされる保証があるため、確実に終了処理を行わせるために非常に重要な機能になっています(「RAII」も参照)。
主に終了処理を担うデストラクタに対応して、オブジェクトを生成するとき(インスタンス化)に自動的に呼び出されるコンストラクタという仕組みもあります。
なお、ガーベジコレクタの機能があるプログラミング言語では、デストラクタによく似たファイナライザを備えていることがあります。ファイナライザは、オブジェクトが不要になったあと、ガーベジコレクタによって回収されるまでのあいだのどこかで呼び出されます。呼び出されるタイミングが明確でないうえ、そもそもメモリに余裕があればガーベジコレクタが働かない可能性もあるため、いつまでたっても呼び出されないケースもあります。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
Twitter でツイート | Twitter をフォロー | LINE で送る |
![]() |
管理者情報 | プライバシーポリシー |