問題タブ [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.

0 投票する
6 に答える
391 参照

c# - ファイナライザーとデストラクタ、ウィキペディアは何と言っていますか?

私が理解しているように、この質問には 2 つの陣営があります。最初の陣営は、ファイナライザーが C# 固有のデストラクタであると考えています。したがって、彼らはこれら 2 つのことは同じであると考えています。

2 番目の陣営は、ウィキペディアに書かれているように、わずかな違いがあると考えています。「「デストラクタ」という用語は通常、決定論的に呼び出されるクリーンアップを意味するために使用されますが、「ファイナライザ」は、ガベージ コレクタが実行するように指示したときに実行されます。

しかし、私自身のために何かを明確にさせてください。決定論的に呼び出されたクリーンアップ? C# の仕様や msdn では、デストラクタは呼び出せない (自動で呼び出される) と書かれています。それらが自動的に呼び出される唯一のケースは、ガベージ コレクターによるものです。

したがって、決定論的に呼び出されるクリーンアップとガベージ コレクターの場合との間に違いは見られません。

そうですか、そうではありませんか?

0 投票する
7 に答える
846 参照

c# - Visual C#にはデストラクタはありませんか?

私が理解しているように、C#のデストラクタ構文(〜ClassName)は、ファイナライザーを作成する方法です。このメソッドは、ILにコンパイルした後、Finalizeメソッドになります。

つまり、C#プログラミング言語はデストラクタをサポートしますが、.netフレームワークの一部としてのVisual C#では、プログラマーはそれを使用できません。

編集:管理されていないリソースをクリーンアップするためにIDisposableインターフェイスを使用できることを知っています。問題はそれについてではありません。問題は、Visual C#にデストラクタが存在するかどうかについてです。デストラクタの構文はファイナライザを作成する方法であるため=>デストラクタ自体を定義する方法はありません。

0 投票する
7 に答える
1541 参照

c# - IDisposableメンバーを持つオブジェクトにIDisposableを実装する必要があるのはなぜですか?

私の知る限り、IDisposableであるメンバーmを持つクラスAがある場合、AはIDisposableを実装し、その中でm.Dispose()を呼び出す必要があるというのが受け入れられたルールです。

これが事実であるという満足のいく理由を見つけることができません。

管理されていないリソースがある場合は、IDisposableとともにファイナライザーを提供する必要があるというルールを理解しています。これにより、ユーザーが明示的にDisposeを呼び出さなくても、ファイナライザーはGC中にクリーンアップされます。

ただし、そのルールが設定されていれば、この質問に関するルールを設定する必要はないようです。例えば...

クラスがある場合:

コンベンションは私が持っているべきであると述べていMyImage : IDisposableます。しかし、Imageが規則に従い、ファイナライザーを実装していて、リソースのタイムリーなリリースを気にしない場合、ポイントは何ですか?

アップデート

私がここで得ようとしていたことについての良い議論を見つけました。

0 投票する
2 に答える
61 参照

java - クライアントコードによって明示的に解放されるべきであったリソースを解放するためにセーフガードを追加する方法

ユーザーはPlayer.close()、ネイティブコードによって管理されているいくつかの重要なリソースを解放し、プレーヤーオブジェクト用に作成されたいくつかの内部Javaスレッドを強制終了するために呼び出すことになっています。ただし、ユーザーがそれを呼び出すことができなかったため、リソースリークが発生しました。内部スレッドが強制終了されていないため、Finalizeメソッドが呼び出されないため、Finalizeメソッドの追加は機能しません...

この状況にどのように対処する必要がありますか?

編集:

ファントム参照を調べます。さらに、プレーヤーオブジェクトがgcの対象になるように、これらの集約されたスレッドを終了するべきではありませんか?

0 投票する
2 に答える
1078 参照

.net - デバッグ中にDispose()を強制する

私はそれが標準的な慣行ではないことを知っていますが、以下を行うことの欠点またはより良い代替案はありますか?コードが適切に使用されていることを確認したいだけですが、.NETはそれを保証するために何もしません。

0 投票する
1 に答える
191 参照

c# - 所有しているオブジェクトが収集されたときにワーカー スレッドを終了するにはどうすればよいですか?

BackgroundWorkerスレッド (純粋に Action デリゲートのキュー)を持つオブジェクトがあります。つまり、これは一般的で単純な単一生産者、単一消費者のシナリオです。

BackgroundWorker単一のプロデューサーが収集されたら、Terminate アクションをスレッドにエンキューしたいと考えています。

ファイナライザーを使用するのは簡単に思えますが、それは「ファイナライザーで管理されたリソースに触れないでください」という規則に違反しています。

では、行う作業がなくなったら、スレッドが正常に終了するようにするにはどうすればよいでしょうか?

受けたくない答え:

  • IDisposable: これには基本クラスへの大規模な重大な変更が必要ですが、おそらく必要であることは認めます (これは常に IDisposable パターンの問題と思われます..)
  • ThreadPool: これらは長時間実行されるアクションであり、順番に実行する必要があります。したがって、専用スレッドが論理的な選択であると考えます。
  • WeakReference: 私はちょうどこれについて考えました。おそらくこれが正しい方法です(?)。基本的に、スレッドはWeakReference所有しているオブジェクトに戻って保持し、定期的に自分自身を起こし、それWeakReferenceがまだ生きているかどうかを確認します。スレッドが死ぬと、Terminate をキューに入れます。正確にはエレガントではありません-「定期的に自分自身を目覚めさせる」ビットは好きではありません-しかし、これは最良の解決策ですか?
0 投票する
3 に答える
2134 参照

c# - c#: サードパーティ ライブラリからのファイナライザー例外を処理する方法は?

ファイナライザーは常に .net フレームワークによって呼び出されるため、シーケンスが制御不能になる可能性があります。コンストラクタが失敗した場合でも、デストラクタをトリガーできます。

このようなファイナライザーの例外がサードパーティのライブラリから発生した場合、これは問題を引き起こす可能性があります: それらを処理する方法が見つかりません!

たとえば、次のコードでは、クラス A のコンストラクターは常に例外をスローして失敗しますが、A のファイナライザーは .net フレームワークによってトリガーされ、A には B 型のプロパティがあるため ~B() も呼び出されます。

これらが私のコードである場合、少し簡単です-ファイナライザーでtry-catchを使用できます。少なくともログを記録できます-例外がプログラムをクラッシュさせ、エラーをできるだけ早く発見できるようにすることができます-または必要に応じて例外を「許容」し、try-catch を使用して例外を抑制し、正常に終了することができます。

しかし、A と B がサードパーティ ライブラリのクラスである場合、何もできません。発生する例外を制御することはできません。例外をキャッチすることもできないため、ログに記録したり抑制したりすることもできません。

私に何ができる?

0 投票する
1 に答える
551 参照

java - IBM Heap Analyzer - メソッドのファイナライズ

次のスクリーンショットは、IBM Heap Analyzer から取得したものです。 ここに画像の説明を入力

「Finalize()メソッドを実装したオブジェクト数」と「Finalize()メソッドを実装したガベージオブジェクト数」の違いが知りたいです。

0 投票する
4 に答える
326 参照

java - Javaのファイナライザーに関する質問

私が次のクラスを持っていると仮定します

このシナリオではどうなりますか?クラスAのfinalizeメソッドを呼び出すと、ある時点でガベージコレクターによって呼び出されますか?

とにかくガベージコレクターによって呼び出される場合、それを呼び出すことと、子クラスのfinalizeメソッドでAのfinalizeメソッドを呼び出さないことの違いは何ですか?

どのシナリオで、子クラスで親のfinalizeメソッドを呼び出さなくても大丈夫ですか?そのようなシナリオの例はありますか?

0 投票する
1 に答える
2697 参照

java - 「ファイナライザーガーディアン」はJavaでどのように機能しますか?

「ファイナライザー ガーディアン」 [Effective Java 、30 ページ] はどのように機能しますか?

それらを使用したことがありますか?特定の問題は解決しましたか?