[csharpll:0332] Re: <教> リソース解放のタイミング

Subject:
[csharpll:0332] Re: <教> リソース解放のタイミング
From:
Satoshi Nakamura <ml@...>
Date:
Wed, 22 Mar 2006 18:58:37 +0900
X-Mailer:
QMAIL 2.9.21.2899 / Windows XP Service Pack 2 / x86
Message-Id:
<379220060322095837ml‐at‐snak.org>
In-Reply-To:
330
References:
329 330
中村です。

At 22 Mar 2006 10:44:06 +0900 FUKUDA, Fumiki wrote:
> - C++/CLI(managed)
>   auto: スコープから外れたらデストラクタ X::~X() が'必ず'動く。
>   heap: GC直前にデストラクタX::~X()が動く。が、GCされずに終了する
>   こともアリ。そんときゃファイナライザX::!X()が(あれば)動く。
>  なのでデストラクタX::~X()はその中でファイナライザX::!X()を呼び、
>  デストラクタ/ファイナライザは'何度呼ばれてもコケないように'
>  実装すべし。

C++/CLIでは、~X()はIDispose::Dispose()と、!X()はFinalize()と(ほぼ)同義で
す(「ほぼ」と書いたのは親クラスのメソッドを自動的に呼び出してくれるかどう
かが異なるためです)。

よって、~X()は明示的に呼び出されない限り呼び出されることはありません(GCの
過程では呼び出されません)。呼び出す方法は二つあり、一つ目はauto変数として
宣言する方法です。この場合、スコープから外れたときに呼び出されます(C#の
usingと同じ)。もう一つは、明示的にdeleteする方法です。

!X()はファイナライザなのでGCの過程で呼び出されますが、AppDomain自体が終了
するような場合には呼び出されないこともあります。

Finalize()(!X())の中からDispose()(~X())を呼び出すことはできますが、多
くの場合メリットよりデメリットの方が大きいことが多いのでよく考えてからやっ
た方が良いと思います。

--
Satoshi Nakamura <snak@...>

スレッド

Navigation

検索

[検索ヘルプ]

Maintener: Tietew <www.tietew.jp>
Powered by Ruby on Rails, Mongrel, PostgreSQL, and Hyper Estraier.
click here