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

c++ - 仮想デストラクタ署名

仮想メカニズムの場合、基本クラスと派生クラスで同じメソッド名を使用する必要があります。ただし、仮想デストラクタの場合、名前は異なる場合があります。

仮想メカニズム(V-Ptr、V-Table)が異なる名前のデストラクタをどのようにサポート/動作するかを誰かが説明できますか?

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

c++ - 派生クラスのデストラクタが非仮想であるのに、派生オブジェクトで基本クラスのデストラクタが呼び出されるのはなぜですか?

以下の例で~D()、すべてのデストラクタ、、、が呼び出されるのはなぜ~C()ですか?~B()~A()

仮想デストラクタは、の1つだけですA

コードは次のとおりです。

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

qt - QMainWindow デストラクタ

QMainWindow のデストラクタが仮想でないのはなぜですか? QMainWindow からクラス MainWindow を継承し、それにポインタ属性がある場合、MainWindow のデストラクタを使用してメモリを削除できません。

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

c++ - 抽象クラスのデストラクタの呼び出し

私は3つのクラスを持っています。

Father抽象的であり、そうですGrandfatherSon抽象的ではありません。

私がこれを行う場合:

そしてこれを行います:

FatherとのデストラクタGrandfatherが呼び出されていることを確認するにはどうすればよいですか?

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

c++ - コンストラクタ/デストラクタが 1 回呼び出されることを確認する必要があります。しかし、「エラー: デストラクタはプライベートです」

次のコードがあります

多くの推奨事項によると、デストラクタはプライベートであり、プログラムの最後に一度だけ呼び出されます。
しかし、私はコンパイラエラーがあります:

当然のことながら、コンストラクタやデストラクタを公開することができ、そのようなエラーは発生しません。ただし、両方が一度だけ呼び出されるようにする必要があります。
どのように?

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

c++ - Xcodeで仮想デストラクタをエクスポートするには?

Xcode 4.4を使用して、AとB(Aにリンク)の2つのモジュールを含むサンプルプロジェクトに取り組んでいます。

モジュール A では、シンボルはコンパイラ フラグ -fvisibility=hidden によって非表示になっています。デストラクタが仮想でエクスポートされたクラスがあります。

そして、それは次のように実装されています:

モジュール B では、MyUtx は以下のように utx から派生します。

一方、モジュール B のリンク エラーの下に常に表示されます。

utx のデストラクタが非仮想の場合、問題はなくなります。

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

c++ - C++ での仮想デストラクタの実装

私は C++ を学び始めていますが、デストラクタで立ち往生しています。ベクトルを実装する必要があり、これが私がこれまでに持っているものです。

インターフェースが与えられ、それを実装する必要があります。しかし、これは C や Java とは大きく異なるため、少し戸惑います。


2 番目の演習では、a) 前の Vector 実装を派生クラスとして使用し、b) Vector を構成クラスとして使用して、このようなものを実装する必要があるため、アプローチの 1 つで仮想デストラクタを使用するのではないでしょうか?

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

c++ - 抽象クラスのデフォルトのデスタクタが仮想でないのはなぜですか?

検討

この時点でA、 が抽象クラスであり、単独でインスタンス化されることは決してないことは明らかです。では、自動生成されたデストラクタも仮想でなければならないことを標準が要求しないのはなぜでしょうか?

インターフェイス クラスでダミーの仮想デスクタクタを定義する必要があるたびに、この質問を自問します。

質問: 抽象クラスで生成されたデストラクタが仮想でないのはなぜですか?

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

c++ - 基本仮想デストラクタと派生仮想デストラクタの両方の効果

複数の仮想デストラクタについて、特に考え直しました。http://blogs.msdn.com/b/oldnewthing/archive/2004/05/07/127826.aspxを読んだ後。

私が持っているとしましょう

cppファイルで、各デストラクタでそれぞれの_loggerポインタを削除しています

これは意図したとおりに機能し、メモリ リークは発生しませんか?

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

c++ - Keil:仮想または保護されたデストラクタとヒープ

私はCortexM3用のARMツールセットでKeil4を使用しています(それが重要な場合でも)。私はこの単純なコードを試しました:

ローカル(メイン内)でDerivedのインスタンスを作成すると、すべてが正常になります。デバッグは機能し、プログラムサイズは約300バイトです。

Derivedの静的またはグローバルインスタンスを作成すると、プログラムサイズが最大1000バイト増加し、BKPT命令でデバッグセッションが停止します。

これは、ヒープサイズがデフォルト値(ゼロ)に設定されているためです。ヒープを追加すると、デバッグが機能し始めました。

デストラクタを保護しますが、仮想ではない場合、同じ動作になります。通常のメソッドを仮想化することはしませんでした。

だから、私の質問は:この状況でコンパイラがヒープを必要とする理由は何ですか?

Vtabは静的に作成され(チェックしました)、グローバルオブジェクトも静的である必要があります。動的割り当てが必要ない場合、ヒープ割り当てコード(およびヒープ自体のスペース)にさらに700バイトを浪費するのはちょっとばかげています。

(警告を防ぐためにデストラクタを仮想化しました。)