C# Destructor

Copyright © 2003, Hirofumi Fujii
(LastUpdate: 29-Jul-2003)

C# の Destructor

C#では、C++と同様にdestructorを書くことができる。しかし、destructor の呼び出される タイミングを制御することはできないようである。例えば次のようなプログラムを 考えよう。

// test of destructor

using System;

public class A
{
  private int myint;

  public A(int a)
  {
    myint = a;
  }
  ~A()
  {
    Console.WriteLine("Destructed[" + myint + "]" );
  }
}

public class Test
{
  public static void Main(String[] args)
  {
    A aobj;
    aobj = new A(1);
    aobj = new A(2);
    aobj = new A(3);
  }
}
このプログラムで、aobj = new A(2); が実行された時点で、 new A(1);で生成された object は不要になっているので、 destructor が呼ばれてもよさそうである。しかし、筆者の環境では new A(1);で生成された object の destructor が呼ばれたのは 一番最後であった。

このことは、共有リソースを利用する Class を作る時は十分注意する必要がある ことを意味する。即ち、一端確保した共有リソースを desctructor で解放するのでは、 いつ解放されるかわかない。もしそれが唯一のリソースだとすると、object が プログラム上で消滅した時点で解放されているとは限らず、次の確保ができないと いう事態が生じる可能性がある。