問題タブ [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++ - スロー例外オブジェクトとしての構造体基本クラス
直観は、スローされた型が単純であるほど良いことを教えてくれます。ポインターよりも int をスローする方が適切であり、クラスよりも構造体をスローする方が適切です。この場合、動的に割り当てられたメンバーを持つほぼ完全なクラスをスローする必要があります。バッファが非常に長くなり、コピーにコストがかかる可能性があるため、ヒープにメモリを割り当てると便利です。他のオブジェクトの制御/引数構造体として機能するため、メソッドを持つ必要はありませんが、構造体へのポインターをスローするためにヒープに構築することと、メモリをクリーンアップするためのデストラクタを持つことの両方が便利です。単純なほど良いので、デストラクタは仮想にする必要がありますか? vtable を省略した方が良いですか、それともvtables は例外の受け渡しにまったく影響しませんか?
この構造体からクラスを基本クラスとして派生させる利点は、ポリモーフ メソッドではなく、データを追加することです。ポインターは、例外ポイントから数層先でキャッチされ、モジュール間で渡される可能性があるため、オブジェクトは可能な限りクリーンに動作し、エラーを複合するリスクを可能な限り少なくする必要があります。
c++ - C++仮想デストラクタ
基本クラスと派生クラスがあり、親仮想のデストラクタを削除したが、サブクラス型のオブジェクトをインスタンス化した場合、破棄されると、親デストラクタの権利が呼び出されます(仮想以降)?派生クラスでデストラクタも宣言すると、両方のデストラクタ(ベースと派生)が呼び出されますか?前もって感謝します :-)。
私の質問の2番目の部分は、最初の部分に関するものです。基本クラスのデストラクタを仮想として宣言する必要があるのはなぜですか。建設業者が階層を循環させないでください。彼らは同じ名前を共有していません、それでそれの必要性はどこにありますか?それはdestrucotrsに対して同じように機能するべきではありませんか、それともデフォルトで呼び出されるのは1つだけですか?また、遅延バインディングを介して、すべてのクラスとオブジェクトが構成されていることを検出できますか?
編集:私の質問は仮想デストラクタだけではありませんが、デフォルトですべて呼び出されるはずなので、なぜ仮想デストラクタを宣言する必要があるのですか?
c++ - クラスには仮想関数とアクセス可能な非仮想デストラクタがあります
私は2つのクラスを持っています:
しかし、g++ ではエラーが発生します。
このエラーの意味がわかりません... ブログのどこかで、これはコンパイラの警告であると読みました。どうすれば問題を解決できますか?
c++ - アップキャスティングを使用する場合の仮想デストラクタ
クラスメソッドの少なくとも1つが仮想である場合、デストラクタは仮想である必要があると誰もが言います。
私の質問は、アップキャスティングを使用する場合、デストラクタは仮想である必要があると言うのは正しいではありませんか?
このコードには仮想関数はありませんが、ベースデストラクタを仮想にしないと、Bデストラクタは呼び出されません。そして、はい、仮想関数がない場合にucpastingを使用するのは無意味であることを私は知っています。
ありがとうございました。
c++ - (仮想) デストラクタを直接呼び出すことは有効ですか?
この回答では、ライアンは仮想デストラクタを直接呼び出します。VS2010 でコードをテストしたところ、すべてのデストラクタが正しく呼び出されました (ロギング ステートメントでテスト済み)。そうすることは実際に有効ですか?このようなアプローチの問題、欠陥、または良い点は何ですか?
reset
少なくともデストラクタでクリーンアップする必要があるため、仮想関数をオーバーライドしなくても、実際の型を実際に強制的にリセットする方法としか考えられません。
また、デストラクタの呼び出しはどのような副作用をもたらすのでしょうか? そのようなデストラクタ呼び出しの後にオブジェクトを使用するのは未定義の動作ですか? 呼び出しですぐに再初期化するとどうなりnew (this) MyClass();
ますか?
c++ - 派生クラスのデストラクタが仮想で、基本クラスの dtor がそうでない場合、コードがクラッシュする
gcc 4.4.5 で次のコードを試しました。
メンバー「データ」が存在しない場合、コードは正常に実行されますが、存在するとクラッシュします。派生クラスの dtor が仮想でない場合にもクラッシュしません。
どちらの場合もC++03 (5.3.5 / 3) に記載されているように動作が未定義になることは承知していますが、後者の場合にクラッシュする理由を誰かが説明してくれますか?
はい、UB が何でも起こり得ることを意味することは知っていますが、それでも実装固有の詳細を知りたいです。
c++ - 純粋仮想デストラクタはどこで宣言する必要がありますか?
編集:明らかに、質問は明確に定式化されていません。私が抱えている問題は、デストラクタがヘッダーで定義されている場合、複数の .obj ファイルに追加され、リンカが文句を言うことです。実際の質問は次のとおりです。
DLL プロジェクトの CPP ファイルにデストラクタを追加し、動的読み込みとインターフェイス ヘッダー ファイルで dll を使用すると、メモリ リークを防ぐためにベース デストラクタが呼び出されますか?
MSVC 10.0 を使用しており、インターフェイスを実装する DLL プロジェクトがあります。インターフェイスは、抽象 (純粋仮想) 基本クラスです。アイデアは、ヘッダーがライブラリの動的ロードで使用されるということです。したがって、純粋な仮想デストラクタを使用して、基本クラスのデストラクタが確実に呼び出されるようにしました。これを説明するサンプル コードを次に示します。
そして、メインの実装ヘッダー
一部のヘルパー クラス
ここでの問題は、リンカがデストラクタに通知するエラーを生成することです。ISplitter::~ISplitter(void) が複数宣言されており、システムがビルドされません。エラー:
これを修正する正しい方法は何ですか? ISplitter.cpp にデストラクタを配置しましたが、ライブラリを動的にロードして基本クラスを ISplitter にアップキャストすると、これが機能しないのではないかと心配しています。
c++ - デフォルトでデストラクタが仮想でない理由 [C++]
C++が、少なくとも 1 つの他の仮想関数を持つクラスのデストラクタをデフォルトで仮想にしないのはなぜですか? この場合、仮想デストラクタを追加してもコストはかからず、仮想デストラクタがないことは (ほとんど?) 常にバグです。C++0x はこれに対処しますか?
c++ - 常に shared_ptr に格納する場合、インターフェイスに仮想デストラクタが必要ですか?
デリータをタイプ消去できるという利点があるためboost::/std::shared_ptr
、次のような素敵なことを行うことができます
そして、正しい削除が保存されているため、これによりすべてのポインターが正しく削除されます。
インターフェイスのすべての実装が常にshared_ptr<Interface>
(または) で作成されることを保証する場合、実際にデストラクタmake_shared<Interface>
が必要ですか? とにかくvirtual
宣言しますが、知りたいのは、初期化された型を常に削除するためです(別のカスタムデリータが指定されていない限り)。virtual
shared_ptr
inheritance - 非 Q のコンストラクタおよびデストラクタでの vtable への undef 参照
現在、Camera と SolidObject の親クラスである GameObject という基本クラスがあります。SolidObject は Player と GameMap の親です。何らかの理由で、GameMap のコンストラクタとデストラクタで vtable への未定義の参照しか取得できません。コードは次のとおりです (Camera や Player は含めません)。注: GameObject と SolidObject は World.h にあり、それらは小さく接続する必要があるためです。これらのクラスと GameMap に関連するものだけを含めます。
継承を切り替えて、GameMap が SolidObject ではなく GameObject を継承するようにしましたが、それでも同じエラーが発生します。
World.h
World.cpp
GameMap.h
GameMap.cpp