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

Subject:
[csharpll:0333] Re: <教> リソース解放のタイミング
From:
FUKUDA, Fumiki <epi-@...>
Date:
Fri, 24 Mar 2006 02:33:30 +0900
X-Mailer:
Microsoft Outlook Express 6.00.2900.2180
Message-Id:
<00d901c64e9f$e8ecfdd0$0f00a8c0@epi1st>
References:
329 330 332
επιστημηです。

>> - C++/CLI(managed)
>>   auto: スコープから外れたらデストラクタ X::~X() が'必ず'動く。
>>   heap: GC直前にデストラクタX::~X()が動く。が、GCされずに終了する
>>   こともアリ。そんときゃファイナライザX::!X()が(あれば)動く。
>>  なのでデストラクタX::~X()はその中でファイナライザX::!X()を呼び、
>>  デストラクタ/ファイナライザは'何度呼ばれてもコケないように'
>>  実装すべし。
>
> C++/CLIでは、~X()はIDispose::Dispose()と、!X()はFinalize()と(ほぼ)同義で
> す(「ほぼ」と書いたのは親クラスのメソッドを自動的に呼び出してくれるかどう
> かが異なるためです)。

子::!子()されたとき、親::!親()は呼ばれないってことですか?
それともC#では子.Finalize()時に親.Filenalize()されないけど、
C++/CLIではやってくれるってことすか?

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

ぢっけんしました。

ref class X {
public:
 ~X() { assert(false); }
 !X() { System::Console::WriteLine("!"); }
};

int main() {
 X^ r;
 for ( int x = 0; x < デカい値; ++i )
   r = gcnew X();
}

…ホントだー、!するけど~しないや。

--- : ------ : ------ : ------ : ------ : ---
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