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

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

c++ - 仮想デストラクタと未定義動作

この質問は、「デストラクタを使用する必要があるのはいつ/なぜvirtualですか? 」とは異なります。'。

質問

  1. これは未定義の動作として分類できますか(確実~D()に呼び出されることはないことを認識しています)?
  2. ~D()空の場合はどうなりますか。それはコードに何らかの影響を及ぼしますか?
  3. new[]/ delete[]withを使用すると、デストラクタの性質に関係なくB* p;~D()は確実に呼び出されません。virtualそれは未定義の動作ですか、それとも明確に定義された動作ですか?
0 投票する
5 に答える
4218 参照

c++ - 非仮想デストラクタを使用する特定の理由はありますか?

私が知っているように、サブクラスを持つように指定されたクラスは仮想デストラクタで宣言する必要があるため、ポインタを介してアクセスするときにクラス インスタンスを適切に破棄できます。

しかし、なぜそのようなクラスを非仮想デストラクタで宣言できるのでしょうか? 仮想デストラクタをいつ使用するかは、コンパイラが決定できると思います。それで、それは C++ 設計の見落としですか、それとも何か不足していますか?

0 投票する
3 に答える
4725 参照

c++ - 仮想デストラクタなしでメモリリークの可能性はありますか?

derv クラスに仮想デストラクタがありません。derv オブジェクトの基本部分だけを削除しますか??

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

c++ - 非仮想の親を持つ仮想クラスから継承する正しい方法

私は 3 つの型を使用するこのテスト コードを作成しました:struct One仮想メンバーを持たない通常の型struct Two : One、純粋な仮想関数と仮想デストラクタを持ち、のインターフェイスをstruct Three : Two実装します。Two

当然のことながら、出力は次のようになりました。

Three::test()
~One()

すべてのデストラクタを仮想化する以外に、これを修正する方法はありますか? それとも、プログラマーはこのような状況に陥らないように注意する必要がありますか? これをコンパイルするときに警告がないのは奇妙だと思います。

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

c++ - 非仮想の親を持つ仮想クラスから継承する正しい方法 (続き)

私の質問は、この質問に基づいています:非仮想の親を持つ仮想クラスから継承する正しい方法

質問に記載されているケースでは、新しく割り当てられたオブジェクトの Three と Two の部分が破壊されていないため、リークしているという私の理解は正しいですか?

ソース:

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

c++ - 保護されたデストラクタを仮想にする用途はありますか?

Parentのデストラクタを仮想化するとエラーになるのですが、保護されたデストラクタを仮想化する目的は何ですか?

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

c++ - 仮想デストラクタ?

非仮想デストラクタを使用した仮想関数であるというエラーがいくつか発生します。このエラーを修正するにはどうすればよいですか?g ++ 4.6.xで動作していましたが、古いバージョンのg++で動作する必要があります。:(

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

c++ - 基本クラスに仮想デストラクタと配列があります。どうすればそれを機能させることができますか?

元:

基本クラスに仮想デストラクタと配列があります。基本クラスのデストラクタが派生クラスのデストラクタによってオーバーライドされた場合、basearray は削除されません。素敵な解決策は何ですか?

0 投票する
3 に答える
106 参照

c++ - g ++に仮想d-torがないと、派生クラスのスタック割り当てメンバーが破棄されないのはなぜですか?

次のコードがあります。

次の出力が期待されます。

しかし、実際には (コードは でコンパイルされます) は、正しく破壊されていないことを理解している限り、gcc印刷されません。なんで?Message: BarbarMessage

私の知る限り、非仮想 d-tor は派生クラスの dtor の呼び出しにのみ影響します。呼び出されることはありませんが、派生クラスのスタック割り当てメンバーはどうですか?

ありがとうございました、

PS私はすでに非推奨の使用法について知っていstd::auto_ptr<>()ます:)

0 投票する
3 に答える
20906 参照

oop - 仮想コンストラクタではなく仮想デストラクタ

仮想コンストラクタがない場合、なぜ仮想デストラクタがあるのでしょうか。コンストラクターも仮想化できますか?