デストラクタ【destructor】解体子
概要

オブジェクト指向言語では、クラスからオブジェクトを生成する際に「コンストラクタ」(constructor)と呼ばれる初期化メソッドが呼び出される。デストラクタはその対となる存在で、オブジェクトの生存期間が終了するタイミングで実行される。多くの言語ではプログラマが明示的に呼び出すコードを書く必要はなく、ランタイムが自動的に呼び出す仕組みになっている。
デストラクタが特に必要とされるのは、プログラムが実行時に動的に確保したメモリや、外部リソースへの接続を保持している場合である。オブジェクトが消滅する際にこれらを適切に解放しなければ、メモリリークやリソースの枯渇といった問題が生じる。デストラクタにその解放処理を記述しておくことで、こうした問題を防ぐことができる。
デストラクタは通常、引数や戻り値を持たず、クラス名に対応した特別な関数名や構文で定義される。多くの言語では一つのクラスに一つだけ定義でき、継承関係では基底クラスから派生クラスへ逆順に実行される。これにより派生側で確保した資源を先に解放し、その後で基底側の後処理が行われる。例外発生時や、途中で処理が中断された場合でも処理系が適切に実行する仕組みになっていることが多い。
プログラミング言語によってデストラクタの扱いは異なる。C++言語ではクラス名の前にチルダ(~)を付けたメソッド名でデストラクタを明示的に定義し、オブジェクトのスコープ終了時やdelete演算子による明示的な破棄時に自動的に呼び出される。一方、JavaやPythonなどガベージコレクションの仕組みを持つ言語では、メモリ管理は実行系が自動的に行うため、デストラクタに相当する仕組みの役割や呼び出しタイミングはC++とは異なる。
Javaにはかつて finalize() メソッドが存在したが、呼び出しタイミングが不確定であるなどの問題から非推奨となった。現代のJavaでは、try-with-resources構文とAutoCloseableインターフェースを組み合わせることで、リソース解放を確実に行う設計が一般的である。Pythonでは __del__ メソッドがデストラクタに相当するが、同様にガベージコレクションとの兼ね合いから呼び出しタイミングは保証されない。