問題タブ [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++ - 基本クラスのデストラクタを仮想として定義しないのはいつ、なぜですか?
以下のこの例は、派生クラスがコピーされないようにする方法を示しています。これは、コピーコンストラクタとコピー代入演算子の両方が宣言されている基本クラスに基づいていますprivate
。
このクラスをプライベート継承と組み合わせて使用すると、クラスをコピーできなくなります。
クラスのデストラクタが次のようにUncopyable
宣言されていないことに注意してください。virtual.
以前、私はそれを学びました
- 基本クラスのデストラクタはである必要があります
virtual
。 - 非基本クラスのデストラクタは作成しないでください
virtual
。
この例では、のデストラクタはでUncopyable
はありませんvirtual
が、から継承されています。これは私が以前に学んだ知恵に反しているようです。
基本クラスのデストラクタを次のように定義しないのはいつ、なぜvirtual
ですか?
c++ - 「これを削除」を実行するときの仮想デストラクタの欠如
C ++ FAQ Liteのセクション16.15で説明delete this
し、次に言及します。
当然、仮想デストラクタがない場合に、このポインタが基本クラスへのポインタである場合は、通常の警告が適用されます。
なぜこれが本当ですか?このコードを考えてみましょう:
このように使用されます:
呼び出しでは、仮想デストラクタがない場合でもp->suicide()
、のデストラクタがMyKlass
期待どおりに呼び出されます。ISuicidal
私にとって、これは理にかなっています。なぜなら、MyKlass::suicide
では、の静的タイプはでthis
あることがわかっているMyKlass*
ので、正しいデストラクタが呼び出されるからです。typeid
これは、内に電話をかけることで簡単に確認できsuicide
ます。
それで、FAQエントリは不正確ですか、それとも私はそれを誤解していますか?
c++ - 暗黙的に削除された仮想デストラクタに関するこのエラーメッセージは何ですか?
Windows、MinGWでGCCを(私が思うに)4.5.6から4.6.1に更新しました。突然、私のNonInstantiable基本クラス(インスタンス化を防ぐためにpublic virtualで継承します)が、次のような同様のエラーメッセージの処理を拒否します。
エラー:
子クラスに仮想またはその他のデストラクタを作成していないためだと思われます。これは、NonInstantiableのプライベート仮想デストラクタと何らかの形で競合しますが、確認が必要です。そして、これらのエラーを抑制し、それでも機能するようにNonInstantiableクラスを修正する方法の解決策。
c++ - デストラクタ本体の内外でリーフクラスからメンバー関数を呼び出すことには違いがありますか?
ここのコードスニペットで分離するのが難しい特定のケースがありますが、それを説明することができます...
私はクラスAを持っています:パブリックBとAはあるタイプのメンバーポインタを持っていますfoo*f。Aの仮想デストラクタには、次のようなものがあります。
ここで、shutdownは非仮想であり、次のようになります。void A :: shutdown(){delete f;}
実行時に、これにより「アクティブな例外なしで呼び出された終了と呼ばれる純粋仮想メソッドが中止されました(コアダンプ)」が得られますが、デストラクタの本体からshutdown()を削除して直接呼び出し、デストラクタを実行させると...私はもうこれを取得しません...
この種の動作を引き起こしている可能性があるのは何ですか?gdbを使ってステップしてみましたが、それは巨大で、何を探すべきかさえわかりません。どんなアイデアでも大歓迎です!
c++ - デストラクタで継承されたIUnknown::Release()を呼び出す
デストラクタのIWICImagingFactoryオブジェクトで継承されたIUnknown::Release()関数を呼び出すと、オブジェクトの仮想関数テーブル(__vfptr)の各エントリに「CXX0030:エラー:式を評価できません」と表示されるのはなぜですか?
これは私が投稿した以前の質問を参照していますが、問題はデストラクタでのみ発生することに気づきました。仮想関数テーブルは、私がチェックした他の場所で有効に見えます。ただし、デストラクタに入ると、すべてのエントリがCXX0030エラーで表示され、継承されたIUknown :: Release()を呼び出そうとして失敗します。
編集:ここに示すためのいくつかのコードがあります:
問題は、WICFactoryオブジェクトでSafeRelease()を呼び出すと、次のようになります。DemoApp.exeの0x0024e135でのファーストチャンス例外:0xC0000005:アクセス違反の読み取り場所0x6d5c28f0。DemoApp.exeの0x0024e135で未処理の例外:0xC0000005:アクセス違反の読み取り場所0x6d5c28f0。
virtual-destructor - C ++に仮想コンストラクタではなく仮想コンストラクタがあるのはなぜですか?
仮想コンストラクタを使用できるのに仮想コンストラクタを使用できないのはなぜですか?
c++ - 配列を使用して仮想デストラクタが失敗する
このコードはWeb サイトで見つけました
なぜクラッシュするのですか?
c++ - クローキング パターンを使用する場合、仮想デストラクタが必要ですか?
データ型を非表示にして情報を格納する次の 3 つのクラスがある場合、仮想デストラクタは必要ですか? いいえと信じさせられましたが、今はよくわかりません。事前の理由から、可能であれば含めたくありません。たとえば、クラスは酒のために取り除かれました。
c++ - 仮想デストラクタに渡されるこの余分なパラメータは何ですか?
私はこのコードを持っています:
これを Visual C++ 10 でコンパイルし、delete object
ステートメントのこの逆アセンブリを取得します。
そしてこれは実際のデストラクタの場合:
push 1
呼び出しサイトで何をしているのかtest
、デストラクタのエントリ ポイントで がその値をチェックし、条件付きで への呼び出しをバイパスするのはoperator delete()
なぜですか?
qt - QtのdeleteChildren()中に子が削除されないようにするにはどうすればよいですか?
Logger
ユーザーが仮想関数をサブクラス化してオーバーライドできるようにするロギングインターフェイスがあるlog()
ので、ユーザーは独自のロガーを作成できます。登録されているすべてのロギングメソッド(コンソール、syslog、ウィジェットなど)を追跡するマネージャーがあります。
ログを表示するQListWidgetロガーを作成しました。残念ながら、これはロギングマネージャによって所有されており、QObjectであるため、MainWindowの子でもあります。これにより、2つのオブジェクトがアプリケーションのクローズ時にそれを削除しようとします。
初めてQObjects->deleteChildren()
呼び出され、削除されます。次に、Loggingmanagerが再試行してクラッシュします。
特定のQObjectが破壊されるのを防ぐにはどうすればよいdeleteChildren()
ですか?それは悪い考えですか?