問題タブ [virtual-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++ - 純粋な仮想デストラクタを 1 行で宣言して実装しますか?
純粋な仮想デストラクタを作成して、クラスを抽象化して、ctor 以外のメソッドを含まないようにしています。私はヘッダーのみの実装としてこれを行っています
virtual ~abstractSchema(){} = 0;
上記の例のように定義と実装を分割するのではなく、1 行で宣言および定義できるようにする(違法) のような構文糖衣はありますか?
c++ - 基本クラスの仮想デストラクタ c++
仮想デストラクタについて混乱しています。多くの質問と説明を読みましたが、基本クラスから派生したクラスがある場合、特別な操作がなくても独自のデストラクタを実装する必要があることをまだ理解していません。
コンパイラは以下のコードをコンパイルしますが、メモリ リークや問題はありますか?
c++ - 「削除」はポリモーフィズムで適切に機能しますか?
2行目は、仮想デストラクタがない場合は基本クラスのデストラクタを呼び出し、存在する場合は派生クラスのデストラクタを呼び出しますがdelete
、メモリを適切に解放します(たとえば、BaseClass
のオブジェクトが8バイトのスペースを占有し、DerivedClass
の 12 - 8 バイトまたは 12 バイトを解放し、どちらの場合もオブジェクトを削除しますか?
c++ - CRT 仮想デストラクタ
今日、dll と実際のプロジェクトで異なる CRT 設定 (MTd MDd) が原因でヒープの破損が発生しました。私が奇妙なことに気付いたのは、dll のデストラクタを仮想に設定した場合にのみ、アプリケーションがクラッシュしたことです。それについて簡単な説明はありますか?ヒープ上にないメモリを解放できないことはわかりましたが、デストラクタを非仮想として定義した場合の違いはどこにありますか。
少しわかりやすくするためのコード
DLL
そして私のプロジェクト
c++ - C++11 でデストラクタの後に識別子をオーバーライドする
仮想デストラクタ宣言後のオーバーライド識別子には特別な意味がありますか?
仮想メソッドでオーバーライド識別子を使用すると、チェックとして役立ちます。ベース仮想メソッドが実際にオーバーライドされていない場合、コンパイラはエラーを報告します。
仮想デストラクタのオーバーライドにも意味/機能がありますか?
c++ - 仮想デストラクタとメモリ解放
仮想デストラクタと、ヒープにスペースを割り当てるという概念を理解しているかどうかはよくわかりません。次の例を見てみましょう。
こういうことをしたら、と想像します。
8 バイト (またはシステムで必要な 2 つの整数) がヒープに割り当てられます。これは次のようになります。| | b | ...
今私がこれを行うと:
「delete」は、ヒープからすべてを削除するために、実際にはどのタイプの o であるかをどのように認識しますか? Base 型であると想定する必要があるため、ヒープから a のみを削除する必要があると思います (b がオブジェクト o に属しているかどうかを確認できないため)。b | ...
b はヒープに残り、アクセスできなくなります。
次のことを行います。
本当にメモリリークを引き起こしますか?ここで仮想デストラクタが必要ですか? または、delete は、o が実際には基底クラスではなく、派生クラスであることを認識していますか? もしそうなら、それはどのように機能しますか?
みんなありがとう。:)
c++ - C++ オブジェクト モデルへのメタクラス レベルの追加
C++ オブジェクト モデルに関するこの理論上の疑問を説明できる人はいますか? それは私の最近の試験で、私はそれに困惑しました。
質問: Java、C#、および Smalltalk の成功に注目して、C++ 標準委員会は言語のオブジェクト モデルに追加のレベルを追加することを決定しました。つまり、各クラスには、実行時に表現を持つメタクラスが必要です。
反対派は、これは言語の基本原則の 1 つに矛盾すると言います。どれの?説明。
反対派はまた、C++ には本格的なメタクラス レベルの機能の一部を可能にする追加の「ハーフレベル」があると主張しています。この「ハーフレベル」とは何ですか?また、その機能を利用できるのはどのようなクラスですか?
サポーターは勝利の議論を思いついた。レベルを追加すると、Mark & Sweep ガベージ コレクションの Mark フェーズがサポートされます (到達可能なすべてのオブジェクトが最初にマークされ、次に到達不能なオブジェクトが解放されます)。彼らの主張は、追加レベルのどの機能に依存していますか?
さらに、サポーターは別の議論を思いつきました。追加のレベルにより、ガベージ コレクション システムがなくても、仮想デストラクタが冗長になります。仮想デストラクタが必要な時期と理由、および追加のレベルによってその要件がどのように排除されるかを説明してください。
c++ - 仮想デストラクタ: 動作しない?
GNU コンパイラを使用しています。クラス B の仮想デストラクタは、デストラクタ ~D() を呼び出しません。誰か教えてくれませんか?
Delete はクラス B で仮想デストラクタを呼び出す必要がありますが、そうではありません。