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

Subject:
[csharpll:0334] Re: <教> リソース解放のタイミング: まとめ
From:
FUKUDA, Fumiki <epi-@...>
Date:
Fri, 24 Mar 2006 02:49:11 +0900
X-Mailer:
Microsoft Outlook Express 6.00.2900.2180
Message-Id:
<00e201c64ea2$1801fdd0$0f00a8c0@epi1st>
References:
329 330
επιστημηです。 再度まとめ←まだ間違ってたりして ^^;;;

- C++
auto: スコープから外れたらデストラクタ X::~X() が'必ず'動く。
heap: 明示的にdeleteされたらX::~X() が'必ず'動く

- C++/CLI(managed)
auto: スコープから外れたらデストラクタ X::~X() が'必ず'動く。
heap: 明示的にdeleteされたらX::~X()が'必ず'動く。 # ここまでC++と同じ
 ただしdeleteしたからといって即座に解放されるわけじゃない。
 deleteせずに放っとくと、GC時にファイナライザX::!X()が(あれば)動く。
 が、X::!X()が呼ばれず終いになることもある(AppDomainが落ちたときとか)。
 なので確実な後始末をやりたきゃX::~X()で後始末し、インスタンスをautoに
 取るか、もしくはheapに取ったんなら明示的にdeleteすべし。これがC#での
 "usingでくるむ"のに相当する。
 # 後始末をX::!X()で行うテもあるが、そんときゃX::~X()内でX::!X()するが吉。
 # (X::!X()は何度呼ばれてもコケぬように書け)←この但し書きは正しい?

- C#
auto: なにそれ? おいしいの?
heap: 確実に動く(C++でいう)デストラクタはない。
 X::~X()は実はファイナライザ。確実に後始末を行いたければ、
 プログラマが明示的に後始末メソッドを呼び出す(finally節で呼ぶが吉)。
 もしくはIDisposableを実装し(void Dispose() 内で後始末を行い)、
 usingでくるんでおく。ただし、Disposeが呼ばれてもインスタンス
 (つかメモリ領域)はGCまで居座ってる。 

--- : ------ : ------ : ------ : ------ : ---
FUKUDA, (episteme) Fumiki
magical, but never a magic....

スレッド

Navigation

検索

[検索ヘルプ]

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