Cmm処理系では、使用されなくなった文字列、配列、クラス、インスタンスは、 ガーベジコレクションによって片付けられることになります。
ディスポーザは、使用済みインスタンスが片付けられる前に呼び出される特別 なメソッドです。
Cmm処理系のメモリ管理部は、インスタンスを廃棄するときに、引数なしで、 `Dipose()' という形式で呼び出すことになります。その返り値は無視されま す。当然、ディスポーザ中でのインスタンスの生成は全く無意味なものとなり ます。
どのようなユーザ定義クラスにおいても、Disposeというメソッド名は、 ディスポーザとして予約されています。この`Dispose'という名前も、`New'同 様、一般的な予約語としては扱われません。
ガーベジコレクションの実装方法は、処理系に委ねられますが、どのような処 理系であれ、あるインスタンスの生成元クラスに、メソッドDisposeがあれば、 それが呼び出されることになります。
クリエータが定義されていない場合は、処理系が自動的に定義しますが、ディ スポーザでは暗黙の定義は行われません。
class Example {
static id_pool = 0;
private id ;
method New () {
id = id_pool++ ;
}
method Dispose() {
println(" - disposing - id:" id) ;
}
}
var i, x ;
for (i = 0 ; i < 10000 ; i++)
x = Example->New() ;
上記コード例を実行すると、Exampleクラスのインスタンスがどんどん生成さ れますが、プログラム上必要なのものは、x に代入されているインスタンスの みとなります。そのため、ガーベジコレクションが発生したとき、それまでに 生成されたインスタンスは、片付けられます。
Exampleクラスのディスポーザによって、片付けられるインスタンスの id が わかります。このidによって、どのインスタンスが片付けられるかが、下記のよ うなメッセージによってわかります。
- disposing - id:0
- disposing - id:1
- disposing - id:2