問題タブ [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 投票する
5 に答える
135 参照

c++ - オブジェクトを多形的に削除する

optrBaseクラスに非仮想デストラクタがある場合、ポインタを削除するときに呼び出されるのは〜Base()デストラクタだけであることを私は知っています。しかし、〜Derived()デストラクタが呼び出されなくても、DerivedObjectによって取得されたメモリが解放されていることがわかりました。だから私の質問は、オブジェクトをデストラクタと呼ばずに解放できるかということです。

答えが「はい」の場合、Derivedクラスに動的に割り当てられた変数が含まれていないので、呼び出されなくてもかまわないので、非仮想デストラクタを使用できますか?

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

c++ - 基本クラスのデストラクタが仮想の場合、派生クラスのデストラクタ定義は必要ですか?

私は次の例を試しています:

Q.1) 実行している基本クラスのデストラクタのように、派生クラスのデストラクタが呼び出されないのはなぜvalues.clear()ですか?

Q.2) 基本クラスのデストラクタが仮想の場合、派生クラスのデストラクタの定義は必要ですか?

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

c++ - なぜこれはメモリリークではないのですか?またはそれは?仮想デストラクタなしで基本クラスポインタを削除する

あるべきではないことに気づいたとき、私はIntel Inspectorでメモリリークをテストして、いじくり回してきました。仮想デストラクタを持たないstd::vectorから継承し、派生クラスに追加のメンバーがあり、動的メモリ割り当てを行います。主に、ヒープ上に派生クラスを作成し、基本クラスにキャストします。 、deleteを呼び出します...そしてメモリリークは検出されませんか?すべての論理で、メモリリークが発生するはずです。

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

c++ - C++: std::map からの継承

から継承したいのですstd::mapが、私が知る限り、std::map仮想デストラクタはありません。

std::mapしたがって、デストラクタで のデストラクタを明示的に呼び出して、適切なオブジェクトの破棄を保証することは可能ですか?

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

c++ - 4 レベルの継承チェーンの C++ 仮想デストラクタ。

私はレビューのために仮想デストラクタを使って少し実験をしていました.

I クラス階層 ABCD を定義します。D は C を継承し、C は B を継承し、B は A を継承し、A はベースです。

2 つの実験を実行しました。

最初の実験 -

A には仮想デストラクタがあります。

B には非仮想デストラクタがあります

Cには仮想デストラクタがあります

D には非仮想デストラクタがあります

//----------------------------

タイプ D のヒープに 4 つのオブジェクトを割り当てます - 最初の 3 つで A*、B*、C* のポインターをポイントします - 完全性のために 4 番目を D* として残します。4 つのポインターをすべて削除します。

予想どおり、4 つのインスタンスすべてで、完全なデストラクタ チェーンが D から A まで逆の順序で実行され、すべてのメモリが解放されます。

第二の実験 -

A には非仮想デストラクタがあります ** A を非仮想に変更しました

B には非仮想デストラクタがあります

Cには仮想デストラクタがあります

D には非仮想ディストラクタがあります

タイプ D のヒープに 4 つのオブジェクトを割り当てます - 最初の 3 つで A*、B*、および C* のポインターをポイントします - 完全性のために 4 番目を D* として残します。

C* および D* ポインタの削除: 完全なデストラクタ チェーンが D から A まで逆の順序で実行され、すべてのメモリが解放されます。

B* の削除: B の後に A デストラクタが実行されます (リーク)

A* の削除: デストラクタのみが実行されます (リーク)

誰がこれがなぜなのか説明できますか?

実験 2 で D 型のオブジェクトが割り当てられると、その直接の基本クラス (C) に仮想デストラクタがあります。これは、コンパイラに Vptr でそれを追跡し、メモリの型を知るように指示しませんか? 参照に関係なく?

ありがとうマイク

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

c++ - 基本クラスのデストラクタが仮想ではなく、子クラスのデストラクタが仮想であるため、プログラムがクラッシュします

次のプログラムがクラッシュするのはなぜですか? デストラクタが仮想ではなく、子クラスのデストラクタが仮想である基本クラスがあります。

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

c++ - 仮想デストラクタ-基礎となるfree()を呼び出すのは誰ですか?

仮想デストラクタを使用して、モジュールAで作成されたオブジェクトをモジュールBから削除しても安全かどうかを判断しようとしています。

MS C ++コンパイラを使用する場合、仮想デストラクタを持つオブジェクトを削除すると、vtable呼び出しが1つだけになり、基になるfree()呼び出しがその内部で実行されます(つまり、オブジェクトを作成したのと同じモジュールで、つまり安全です)。

質問は次のとおりです。それは現在のMS実装だけですか、それとも何らかの標準またはドキュメントで保証されており、安全に信頼できますか?

VS2010での逆アセンブルされた仮想デストラクタ呼び出しの例を次に示します。

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

c++ - BaseClassリストを介して派生ClassObjectsのデストラクタを呼び出す

このクラスを取得して、すべての派生オブジェクトのリストを取得しました

および派生クラス

リストとその中のオブジェクトを削除するだけで、構造全体を削除したいと思います。

私はで試しました

しかし、オブジェクトはまだインスタンス化されています

私はアイデアがありません^^

親切に..

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

c++ - C++ 仮想デストラクタとシンボル参照エラー

親クラスと子クラスにポリモーフィズムを適用するための仮想メソッドが必要なため、仮想デストラクタを配置しました。ただし、エラーが発生し続けます

子:: ~Child()

Child:: Child() はシンボル参照エラーです。

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

c++ - 仮想デストラクタ:基本クラスがメモリを動的に割り当てた場合、基本クラスで必要ですか?

この質問は、仮想デストラクタでの説明のように見えます。動的にメモリが割り当てられていない場合に必要ですか?

試験の質問で、私は尋ねられました:-動的に割り当てられたメモリへのポインタを維持する基本クラスは何を定義する必要がありますか?

私は答えました:-コピーコンストラクタと代入演算子(ポインタだけがコピーされるのではないことを確認するために...ディープコピーを参照)、およびデストラクタ(割り当てられたメモリを解放するため)

この基本クラスは、プレーンデストラクタではなく仮想デストラクタも定義する必要があるため、これは正しくないと彼らは言いました。なんで?