問題タブ [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.
c++ - C++コンストラクタおよびデストラクタ
プログラムのコンパイル時にエラーが発生します。それらは私のクラスInstructionのコンストラクタとデストラクタに関連しています。
エラーは次のとおりです。
これが私のコードです:
////////////////////////////////////////////////// ///////////////////
c++ - デストラクタは、オーバーロードされている場合でも、削除演算子に対して常に呼び出されますか?
古いコードを少し C から C++ に移植しています。古いコードはオブジェクトのようなセマンティクスを使用し、ある時点でオブジェクトの破棄と現在使用されていないメモリの解放を分離し、その間に次のようなことが起こります。
上記の機能は、標準デストラクタ ( ~Object
) とそれに続く への呼び出しを使用して、C++ で可能delete obj
ですか? それとも、私が恐れているように、それを行うとデストラクタが 2 回呼び出されるのでしょうか?
特定のケースでは、operator delete
ofObject
もオーバーライドされます。私が他の場所で読んだ定義(「演算子deleteが使用され、オブジェクトにデストラクタがある場合、デストラクタは常に呼び出されます)は、オーバーライドされた演算子の場合に正しいですか?
c# - ASP.NET-Page (C#) によるサーバー クラッシュ
ログファイルに書き込もうとすると、ローカルのテスト サーバーがクラッシュします。私はこれを ASP.NET ページに使用しています。分離コードは C# です。
構造:
負荷Functions
としてのインスタンスを作成します。index.aspx
ではFunctions
、ロギング用の関数を定義します。この関数は、から呼び出されindex.aspx.cs
、次のようになります。
_Writer
クラスに対してグローバルに定義されており、ご覧のとおり、StreamWriter が含まれています。クラス自体には、ファイルへの接続を閉じるためのデストラクタがあります。
そのため、ページを開くとログが書き込まれますが、サーバーがクラッシュします。したがって、問題はデストラクターのどこかにあると思いますが、理由がわかりません...
c# - 静的クラスにデストラクタを持たせないのはなぜですか?
これには 2 つの部分があります。
静的クラスが静的コンストラクターを持つことができる場合、なぜ静的デストラクタを持つことができないのでしょうか?
最善の回避策は何ですか? COM オブジェクトである接続のプールを管理する静的クラスがあり、プログラムの他の場所で何かが爆発した場合に接続が閉じられるか解放されるようにする必要があります。
c# - デストラクタが呼び出されるのはなぜですか?
IDictionary インスタンス メンバーを介して他のクラスへの参照を保持するクラスがいくつかあります。
そのようです:
これがセットアップであり、この辞書からそれらを削除することは決してありませんが、何らかの理由で、クラス B のデストラクタが GC の実行で時々呼び出され、その理由がわかりません。
Dictionary クラスが新しい参照を追加する方法と関係があるのでしょうか?
固定:
わかりました、あなたの答えをありがとう、私は確かに今GCとデコンストラクターについて大きな理解を得ています.
しかし、問題は私自身のものでした.someIntがまだ存在しない場合にのみ追加し、ビジネスロジックに欠陥があるため、someIntは常に1だったので、初めて機能し、デコンストラクターが呼び出されませんでした. しかし、2 回目は "b" インスタンスがリストに追加されず、GC 実行でクリーンアップされました。
助けてくれたすべての人にもう一度感謝します!
c++ - 式内の一時オブジェクトのC++破棄
次のコードが与えられます:
次の出力が得られます。
これが正しいことはわかっていますが、理由はわかりません。stdc ++の知識を持っていて、私に説明してくれる人はいますか?
c++ - 関数が例外をスローしないことがわかっている場合は、デストラクタに try...catch ブロックを配置しますか?
デストラクタが例外をスローしてはならないことはわかっています。
http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.13
私は次のコードを持っています:
私の静的ソースコード分析では、次のようにクリーンアップ関数を呼び出す必要があると不平を言っています。
関数を呼び出すたびに、デストラクタに try...catch ブロックを配置するのが良い方法かどうかはわかりません。として :
(1) クリーンアップ関数が例外をスローできる場合、何か問題が発生したことがわかります。私はそれがフェイルファストであることを好みます。つまり、システム全体をクラッシュさせ、プログラマーにデバッグさせます。
(2) try...catch ブロックの入出時にオーバーヘッドが発生する。
(3) クラスのデストラクタの周りに多くの try...catch ブロックがあり、コードが煩雑に見えます。
なぜ try...catch ブロックを配置する必要があるのでしょうか。
ありがとう。
c# - C#-「デストラクタは継承されない」とは実際にはどういう意味ですか?
C#言語仕様3.0のセクション10.13、デストラクタは次のように述べています。
デストラクタは継承されません。したがって、クラスには、そのクラスで宣言できるデストラクタ以外のデストラクタはありません。
C#プログラミングガイドのデストラクタセクションには、継承階層内のデストラクタがどのように呼び出されるかを示す例が含まれています。これには、次のステートメントが含まれます。
...クラスのデストラクタは自動的に呼び出され、最も派生したものから最も派生しなかったものへと順番に呼び出されます。
デストラクタを定義する基本クラス、基本クラスから継承し、デストラクタを定義しない派生クラスなど、さまざまな実用的な例でこれを調査しました。派生クラスのインスタンスを作成し、インスタンスへのすべての参照をスコープ外に出してからガベージコレクションを強制すると、派生クラスのインスタンスがファイナライズされたときに基本クラスで定義されたデストラクタが呼び出されることがわかります。
私の質問は、「デストラクタは継承されない」とは実際にはどういう意味ですか。デストラクタを明示的に呼び出すことはできませんが、継承チェーン内のデストラクタは自動的に呼び出され、派生クラスがデストラクタを定義していなくても基本クラスのデストラクタが呼び出されます。 ?
ファイナライズがC#言語/コンパイラではなくガベージコレクタによって実装されるという、いくつかの微妙な意味上の違いに関連していますか?
編集1:
C#言語仕様では、「インスタンスコンストラクターは継承されない」と規定されていますが、コンストラクターに関連する動作は記述子とは大幅に異なり、以下の例に示すように、「継承されない」用語でIMOに適合します。
次の例に示すように、デストラクタに関連する動作はこれとは大きく異なります。次の例では、基本クラスにのみ記述子を追加することで、前のコンストラクタの例を拡張しています。
上記の例は、派生クラスがデストラクタを明示的に定義していなくても、派生クラスのインスタンスがファイナライズされたときに基本クラスコンストラクタが呼び出されることを示しています。
私の言いたいことは、これが何が起こっているのかを理解または理解していない多くの人々に出会ったということです。この理由の重要な部分は、「デストラクタは継承されない」というステートメントです。
編集2:
C#言語仕様には、次のことも記載されており、内部実装のコード例が示されています。
デストラクタは、System.Objectの仮想メソッドFinalizeをオーバーライドすることによって実装されます。C#プログラムでは、このメソッドをオーバーライドしたり、直接呼び出したり(またはオーバーライドしたり)することはできません。
ボンネット内の実装は、実際には、前述のように継承に基づいているため、私の質問は有効であり、これまでに受け取った応答のいずれも、質問に適切に対処していないと思います-何「デストラクタは継承されない」とは、実際にはどういう意味ですか?
c# - デストラクタとファイナライザの違いは?
注意: この質問は、「デストラクタ」と「ファイナライザ」という言葉の用語の違いと、それらの正しい使用法に関するものです。C# および C++/CLI での使用例を示して、なぜこの質問をするのかを示しただけです。C# と CLR の両方でどのように実装されているかはよく知っていますが、用語の正しい使い方について質問しています。
C# の世界では、「デストラクタ」と「ファイナライザ」という用語はほぼ同じ意味で使用されているように思われます。これは、C# の仕様では「デストラクタ」という言葉を使用して非決定論的クリーンアップ機能が記述されているためだと思われますが、CLR のドキュメントでは常に「ファイナライザー」という言葉なので、C# の領域内では同じことを意味します。
ただし、C++/CLI 仕様では、この 2 つが区別されています。決定論的および非決定論的なクリーンアップの両方が可能であり、決定論的な機能には「デストラクタ」という用語を使用し、非決定論的な機能には「ファイナライザ」という用語を使用します。
ファイナライザーは、非決定的なクリーンアップを提供します。ファイナライザは、通常、デストラクタが実行されなかったオブジェクトに対して、ガベージ コレクション中に実行される「ラストチャンス」関数です。
さらに、ウィキペディアのデストラクタとファイナライザの説明は、デストラクタとファイナライザが別の概念であることを示しており、決定論に関する C++/CLI 仕様の用語の使用をサポートしています。
デストラクタとは異なり、ファイナライザは決定論的ではありません。プログラムがオブジェクトを明示的に解放すると、デストラクタが実行されます。対照的に、ファイナライザーは、内部ガベージ コレクション システムがオブジェクトを解放するときに実行されます。
質問:
コンピュータサイエンスの観点から、「デストラクタ」と「ファイナライザ」の間に明確に定義された違いはありますか、それとも用語は文脈上でのみ定義できるものですか?
明確に定義された違いがある場合、なぜ C# 仕様は「間違った」用語を使用するのでしょうか?
c++ - SIGABRTが発生すると、スタックは巻き戻されますか?
C ++でSIGABRTが発生すると、スタックは巻き戻されますか(デストラクタが実行されます)?
ありがとう。