問題タブ [destructor]

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 投票する
2 に答える
1667 参照

c# - C#でのリモーティングとデストラクタ

私は.netリモーティング機能で遊んでいますが、Googleで理解も答えも見つからないことがあり、オブジェクトの破棄がどのように機能するかを示しています。

基本的に文字列とブール状態のインジケーターである静的オブジェクトのリストを作成するために、リモーティングを使用してある種のオブジェクトプーリングを実装しようとしています。

新しいリモートオブジェクトを要求するとき(コンストラクターの実行中)、プールに空きがあるかどうかを確認し、使用中およびオブジェクトの破棄中にプールにマークを付けます。DismisObjectは、単に「無料」としてマークします。

タイムアウトは正常に機能します-オブジェクトを使用しようとすると、5分間のアクティビティの後、リモーティング例外が発生しましたが、Dispose()関数ではなく〜MyRemotableObject()が呼び出されないため、オブジェクトがプールで空きとしてマークされることはありません。プログラムを閉じても、オブジェクトはプール内でアクティブなままです。それを解放する唯一の方法は、手動でDispose関数を呼び出すことです(たとえば、プログラムがクラッシュしたり、ユーザーが開いたままになっている場合は、これを行うことはできません)。

接続を閉じるときに.netにオブジェクトを強制的に破棄/破棄させる方法はありますか?(ある場所で、CGが時々それを行う必要があることがわかったので、4つのクライアントを開いて、2つをクラッシュさせました。他の2つはしばらくして切断されましたが、オブジェクトはまだアクティブとしてマークされています)

0 投票する
12 に答える
1798 参照

c++ - デストラクタでメンバーを削除しないようにするにはどうすればよいですか?

クラスのデストラクタで、他の場所で削除されたメンバーの 1 つを除いて、オブジェクト全体を削除したいと思います。まず、これはまったく理不尽ですか?そうでないと仮定すると、どうすればこれを行うことができますか?空のボディでデストラクタを作成すると、すべてのメンバーが削除されるのを防ぐことができると思いました(デストラクタは何もしないため)が、そうではないようです。

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

delphi - TThread オブジェクトを破棄する適切な方法

この質問は些細なことのように思えるかもしれませんが、無視しないでください。
通常、TThread オブジェクトを破棄する前に、TThread.Execute() メソッドを呼び出したスレッドが終了するまで待機する必要があります。これは、たとえば、クラスのデストラクタ内で破棄されたオブジェクトがアクセスされなくなったことを確認できるからです。したがって、Terminate を呼び出して終了するかどうかを知るためにスレッドがチェックする必要のある Terminated フラグを設定してから、WaitFor() メソッドを呼び出す必要があります。

スレッドが一時停止している可能性があるため、WaitFor を呼び出す前にスレッドを再開するのがよいと思います。そうしないと、呼び出し元のスレッドがデッドロックしてしまいます。また、スレッドは複数回中断できるため、同じ回数だけ再開する必要がありますよね?

スレッドがサスペンド状態で作成された場合、スレッドを終了するためだけにスレッドを再開するときに TThread.Execute() メソッドが呼び出されることを心配する必要はありません (間違っていたら訂正してください)。

私が述べたことは、解放される各 TThread オブジェクトに対して次のコード行を使用することを提案しています。

残念ながら、複数のスレッドを作成したアプリケーションを破棄する場合、破棄される TThread オブジェクトごとにそのようなコードを不必要に記述すると、コードが非常に長くなり、場合によっては不透明になります。

したがって、これらすべてを TThread クラスのオーバーライドされたデストラクタ内に配置できるという結論に達しました。そのおかげで、破棄されたかどうかを気にせずに MyThread.Free (または MyThread.FreeOnTerminate が設定されている場合は MyThread.Terminate) を呼び出すだけで十分です。 object が TThread オブジェクトかどうか:

こんな初歩的な質問ですみません。ただし、TThread オブジェクトを破棄するこの方法 (普遍的な方法であることを願っています) について、あなたの意見を知りたいと思います。同僚のコードから、彼らは通常、最初のコード例を使用してそのようなオブジェクトを破棄することを学びましたが、待機中のスレッドが中断されていないかどうかを確認することは一度もありませんでした。コードのどこかで中断されている可能性があります。したがって、コードをより明確かつ安全にする、このクラスのオブジェクトを破棄する普遍的な方法を見つけようとしました。私はそれを悪化させなかったことを願っています - あなたはどう思いますか?

事前にご提案いただきありがとうございます。

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

c++ - CMultiDocTemplate の View/Doc/Frame の破棄順序は何ですか?

ドキュメントのフレーム オブジェクトへのポインタを持つ MDI アプリケーションで作業しています。他のスレッドは、ポインターを使用して PostMessage を呼び出しています。シャットダウン中、フレームが破棄されている間、スレッドは引き続きフレームにメッセージを投稿しようとします。MFC の MDI 実装における複数のドキュメントの破棄順序を知っている人はいますか? これを簡単にするために処理する必要があるメッセージはありますか (おそらくフレームの ON_WM_CLOSE)?

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

c - トークンのセマンティック値 (シンボル レコード) を正しく破壊し、GNU Bison を使用してメモリ リークを回避する方法は?

私は単純化された Pascal パーサー/インタープリターを書いていますが、今はセグメンテーション違反について考えています。まだ取得していません。すべて正常に動作していますが、Cygwin で開発しているため、valgrind を使用してプログラムをテストすることはできません。

基本的に私がやっていることは以下のとおりです。

もちろん、トークンは正しく入力されています。問題は、たとえば、いくつかの式を否定する場合です。通常、新しいものを malloc する代わりに、いくつかの symrec * を再利用します。

例:

もちろん、これは私のコンテキストでは有効ではありません (データ型として int または double を考慮した例では)、symrec * を適切に解析していますが、このシナリオでは、デストラクタは $2 を解放せず、$$ をそのままにします。ある種のダングリングポインター?

これを書いている時点で、これが実際に起こってセグメンテーション違反が発生した場合は、$2 = NULL; を作成するだけでよいと考えています。%destructor{} 句でそれを確認しますか?

PS: 私は英語のネイティブ スピーカーではなく、これをかなり長く作成したため、混乱したアイデアについてはご容赦ください。すぐに再説明します。

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

c++ - NULL ポインターを削除すると、デストラクタが書き込まれたときにオーバーロードされた削除が呼び出されない

このコードでは、デストラクタがある場合、delete wオーバーロードされた演算子を呼び出しません。deleteデストラクタを省略すると、オーバーロードされたものdeleteが呼び出されます。これはなぜですか?

~Widget() 書き込み時の出力

operator new
メモリ不足

~Widget() が書かれていない場合の出力

operator new
メモリ不足
operator delete

0 投票する
8 に答える
29881 参照

c++ - デフォルトのデストラクタを自動的に仮想デストラクタとして生成できますか?

デフォルトのデストラクタを自動的に仮想デストラクタとして生成できますか?

基本クラスを定義してデフォルトのデストラクタを定義しない場合、デフォルトの仮想デストラクタが自動的に生成されますか?

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

clr - ファイナライズ到達可能テーブル

クラス Foo にデストラクタを実装すると、Foo のインスタンスがファイナライズ キューで厳密に追跡されます。Foo のインスタンスがガベージ コレクションされると、CLR がファイナライズ キュー内のエントリを確認し、オブジェクトをヒープからファイナライズ到達可能テーブルに移動することで、そのオブジェクトに特別な処理を与えることを理解しています。その後...そのガベージコレクションサイクルで他に何も起こらないのですか?

finalize() は次のガベージ コレクション サイクル中に常に呼び出されますか?

オブジェクトを freachable テーブルにコピーした直後に finalize が呼び出されないのはなぜですか? (これは余分な不必要な複雑さのようです)

0 投票する
5 に答える
3763 参照

c++ - C++ で例外をスローできる関数を呼び出すデストラクタ

デストラクタから例外をスローしてはならないことはわかっています。

デストラクタが例外をスローできる関数を呼び出した場合、デストラクタでそれをキャッチし、それ以上スローしなくても問題ありませんか? それとも、とにかくアボートを引き起こす可能性があり、デストラクタからそのような関数を呼び出すべきではありませんか?

0 投票する
11 に答える
99741 参照

c++ - C ++で純粋な仮想デストラクタが必要なのはなぜですか?

仮想デストラクタの必要性を理解しています。しかし、なぜ純粋な仮想デストラクタが必要なのですか?C ++の記事の1つで、クラスを抽象化する場合は、純粋な仮想デストラクタを使用すると著者は述べています。

ただし、メンバー関数のいずれかを純粋な仮想として作成することにより、クラスを抽象化できます。

だから私の質問は

  1. デストラクタを本当に仮想にするのはいつですか?誰かが良いリアルタイムの例をあげることができますか?

  2. 抽象クラスを作成するとき、デストラクタも純粋な仮想にするのは良い習慣ですか?はいの場合..それではなぜですか?