C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 54 を表示中)
■30324 / )  Re[5]: C++/CLIでメモリ解放が遅い
□投稿者/ Azulean (250回)-(2008/12/21(Sun) 10:39:38)
> 例外でnewの部分自体がだめになるわけではないので、Disposeかファイナライザは必ず呼ばれます。
「Dispose(デストラクタ)が必ず呼ばれる」ならOKですが、「Dispose(デストラクタ)が呼ばれなくても、ファイナライザが呼ばれるから大丈夫」ならNGです。

ファイナライザが動くのはガベージコレクションが動いた後ということで、いつになるか分かりません。
forループを抜けても、そのメソッドを抜けても、ファイナライザが呼ばれない可能性はあります。
そのため、Disposeが途中で例外がスローされても呼び出されるようにしておかないと、アンマネージメモリ解放が遅くなる可能性があります。

# Disposeはあくまでアンマネージリソースの解放タイミングを与えるものですので、マネージオブジェクトが巨大な場合は効果が薄いかも知れません。


ところで、サンプルではデストラクタがファイナライザのコードを呼んでいますが、意味合いとしては分けた方が良いと思います。
マネージオブジェクトの解放順は保障されていないため、コードの書き方によっては意図せぬ動作をする可能性があります。
http://msdn.microsoft.com/ja-jp/library/system.object.finalize.aspx
返信 編集キー/


管理者用

- Child Tree -