問題タブ [finalizer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - .netデストラクタで「this」へのルート化された参照を再作成することは合法ですか?
.netに次のように書くことは合法ですか?
期待どおりに動作し、コンソールに「0」を書き込みますが、常に動作することが保証されているのではないかと思います。
誰かが舞台裏で何が起こっているのか知っていますか?
c# - C# デストラクタ (別名: ファイナライザ) に関連するコストは?
デストラクタは、オブジェクトが保持しているアンマネージ リソースのみを解放する必要があり、他のオブジェクトを参照するべきではありません。管理参照しかない場合は、デストラクタを実装する必要はありません (実装すべきではありません)。これは、管理されていないリソースを処理する場合にのみ必要です。デストラクタを使用するとコストがかかるため、管理されていない貴重なリソースを消費するメソッドにのみ実装する必要があります。
この記事ではこれについて詳しく説明していませんが、C# でデストラクタを使用すると、どのようなコストが発生するのでしょうか?
注: GC と、信頼できるタイミングでデストラクタが呼び出されないという事実については知っていますが、それ以外に何かありますか?
c# - .NET - ファイナライザーと exit(0)
終了するためにスレッドでexit(0)
(from )への呼び出しを使用する .NET C# / C++ アプリがあります。<stdlib.h>
奇妙な点は、状況によっては、マネージド オブジェクトのファイナライザーが への呼び出しの直後に呼び出されexit
、他の状況ではまったく呼び出されないことです。
状況は非常に決定論的です。アプリは、その有効期間中に外部プラグイン dll (アンマネージ C で記述) からいくつかのメソッドを呼び出します。
dll A を使用すると、ファイナライザーが常に呼び出されます。
dll B を使用すると、ファイナライザーは呼び出されません。
exit(0) 呼び出しの場合のファイナライザーの予想される動作は何ですか? (予期され、文書化された動作がある場合)
外部 dll への呼び出しは、プロセスが終了する方法に影響を与える可能性のあるグローバル設定を変更できますか?
.net - 実際、フォントを破棄することはどれほど重要なのでしょうか?
ベスト プラクティスは、IDisposable を実装するオブジェクト、特にファイル ハンドル、ソケット、GDI ハンドルなどの有限リソースをラップするオブジェクトで Dispose を呼び出すことです。
しかし、Font を持つオブジェクトがあり、オブジェクトのいくつかのレイヤーを介して IDisposable を配管し、多くの使用法を確認して、Font が常に破棄されるようにする必要があります。そして、それが複雑さの価値があるかどうか疑問に思っています。
GDI リソースはシステム グローバルであるため、Font が HFONT をラップした場合は問題ありません。ただし、Font は GDI ハンドルをラップしません。それは完全に独立したシステムであるGDI +であり、私が理解している限り、GDIのようにシステムグローバルではなく、プロセスローカルです。また、Image とは異なり、Font はファイルシステム リソースを保持することはありません (とにかく、私は知っています)。
だから私の質問は次のとおりです。フォントにガベージコレクションをさせることの実際のコストはいくらですか?
ファイナライザーに小さなヒットを与えることはわかっていますが、「リークされた」フォントの数が少ない場合 (半ダースなど)、そのヒットは正直なところ目立ちません。ファイナライザーを除けば、これは中規模の配列を割り当てて GC にクリーンアップさせるのと大差ないように見えます。これは単なるメモリです。
Font を GCed にする際に、私が気付いていないコストはありますか?
asp.net - プロパティのコレクションを破棄してファイナライズしますか?
継承したばかりのvb.netコードを見ていますが、元の開発者がなぜこれを行うのか理解できません。
基本的に、各「ドメイン」クラスはプロパティのコレクションです。そして、それぞれが IDisposable.Dispose を実装し、Finalize() をオーバーライドします。基本クラスがないため、それぞれが Object を拡張するだけです。
Dispose は、各プライベート変数を Nothing に設定するか、プロパティが別のドメイン オブジェクトである場合は _private.Dispose を呼び出します。破棄された状態を追跡するプライベート var があり、Dispose の最後のものは GC.suppressFinalize(Me) です。
Finalize は Me.Dispose と MyBase.Finalize を呼び出すだけです。
これに何かメリットはありますか?害はありますか?管理されていないリソースも、データベース接続もありません。これを必要とするものは何もありません。
.net - C ++/CLIシナリオでGC::KeepAliveを呼び出す便利な方法は?
私はC++/CLIを使用していくつかのマネージラッパーを書いています。問題は、管理されていないメンバーを使用しているときに、GCがオブジェクトを破棄することがあることです。(この動作は非常識だと思いますが、これは別のトピックです)。詳細については、以下を参照してください。
オブジェクトがまだ使用されている間にファイナライザーが起動しました http://blogs.msdn.com/cbrumme/archive/2003/04/19/51365.aspx
私が探しているのは、電話をかけるのに便利な方法です。
すべてのメソッドの最後に。単純な古いvoidメソッドの場合は十分に簡単ですが、値を返すメソッドの場合は少し注意が必要です。
次のように変換する必要があります:
これは私には少し醜いように見えます。
dtorでGC::KeepAliveを呼び出すガードクラスを検討しましたが、少し過剰に見えるすべてのメソッドでctorとdtorの呼び出しが発生します。
一時変数を回避できるC++の魔法はありますか?
編集
私は、try +が最終的に私のためにトリックを行うことに気づきました。つまり、次のようになります。
最後に、これを処理するマクロを実装しました。
c# - C#でのFinalize/Disposeメソッドの使用
C#2008
私はこれにしばらく取り組んできましたが、コードでのfinalizeメソッドとdisposeメソッドの使用についてはまだ混乱しています。私の質問は以下の通りです:
管理されていないリソースを処分するときに必要なのはファイナライザーだけであることを私は知っています。ただし、管理されていないリソースを呼び出す管理されたリソースがある場合でも、ファイナライザーを実装する必要がありますか?
ただし、管理されていないリソースを直接または間接的に使用しないクラスを開発する場合、
IDisposable
そのクラスのクライアントが「usingステートメント」を使用できるようにを実装する必要がありますか?クラスのクライアントがusingステートメントを使用できるようにするためだけにIDisposableを実装することは可能でしょうか?
/li>Finalize / disposeの使用法を示すために、以下の簡単なコードを開発しました。
/li>
ソースコードに関する質問:
ここではファイナライザーを追加していません。通常、ファイナライザーはGCによって呼び出され、ファイナライザーはDisposeを呼び出します。ファイナライザーがないので、いつDisposeメソッドを呼び出しますか?それを呼び出さなければならないのはクラスのクライアントですか?
したがって、この例の私のクラスはNoGatewayと呼ばれ、クライアントは次のようにクラスを使用して破棄できます。
実行がusingブロックの最後に達すると、Disposeメソッドが自動的に呼び出されますか、それともクライアントはdisposeメソッドを手動で呼び出す必要がありますか?すなわち
/li>WebClient
クラスでクラスを使用していNoGateway
ます。インターフェイスをWebClient
実装しているため、これは間接的に管理されていないリソースを使用することを意味しますか?これに従うための厳格なルールはありますか?クラスが管理されていないリソースを使用していることをどのように知ることができますか?IDisposable
WebClient
java - ファイナライズ中のオブジェクトへの参照
finalize 呼び出し中に現在のオブジェクトへの参照を保存するとどうなりますか? 例えば:
オブジェクトがガベージ コレクションされているかどうか。bar.REFERENCE
後でアクセスしようとするとどうなりますか?