問題タブ [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++ - 基本クラス'classstd ::vector<...>'には非仮想デストラクタがあります
std::vector
私のC++クラスの1つは、そのコンテンツに対してカスタムアクションを実行するコンテナーとしても機能できるように派生しています。残念ながら、コンパイラはデストラクタが仮想ではないことについて不平を言います。これは標準ライブラリにあるため、変更できません。
私はすべてを間違ってやっていますか(あなたはSTLから派生してはいけません)、それともコンパイラを幸せに保つために私ができることがありますか?(-Weffc++の使用を停止することからのアパート:)
編集:派生クラスはベクトル操作アルゴリズムに影響を与えませんが、画像のベクトルの「要素の幅/高さ」などの情報を追加するだけです。例として、あなたは考えることができます
ここで、フォトアルバムは、主に、いくつかのメタデータ(タイトルと時間)と、アルバムカバーを作成するためにいくつかの写真のサムネイルを表面にレンダリングするなどのアルバム固有の機能を備えた写真のコレクションと考えます。だから私見、フォトアルバムIS-AのコレクションPhoto
、それ以上に-そのようなコレクション。
余分な「コレクション」フィールドを持つgetPhotoVector()
メソッドを使用することで得られるメリットはわかりません。PhotoAlbum
c++ - 仮想デストラクタを強制しますか? C++
C++ Faq lite でこれに対する答えが見つかりませんでした:
基本クラスを定義して、それを継承するすべてのクラスがデストラクタを定義する必要があるようにするにはどうすればよいですか?
このプログラムを実行してみました
http://codepad.org/wFcE71w3 エラーあり
それで、それは可能ですか?
c++ - C++ 仮想デストラクタのクラッシュ
次のクラス階層があります。
オブジェクトと一緒に
スレッドを使用して MoreDerived オブジェクトを削除する必要があるコードの一部があるため、最初に void* にキャストする必要があります。スレッドでは、私は持っています
ポインターは NULL ではなく、 void* ptr
MoreDerived * (または少なくとも Base*) ですが、アプリケーションは引き続きクラッシュします...
c++ - shared_ptrに仮想記述子がないのはなぜですか?(そしてどうすればこれを回避できますか?)
作成または破棄されたときに特定の操作を実行する特別なバージョンを作成したかったのshared_ptr
ですが、デストラクタが非仮想であるという認識によって計画が失敗したようですshared_ptr
。つまり、オーバーライドすると、ポインタがクリーンアップされることはありません。それらの最後のインスタンスが破壊されたとき。
頭に浮かぶ唯一の選択肢は、この動作を、仮想のカスタムで使用したいすべてのクラスに組み込むことですがshared_ptr
、それは実行可能ではありません(場合によっては可能です)。
編集:
これが必要な理由は、luaでいくつかのクラスをuserdataオブジェクトとして使用したいためです。また、この方法で使用する各オブジェクトに、すべての参照がクリーンアップされるときに固有のfenvテーブルを持たせたいためです。オブジェクトが削除されました。fenvテーブルを保持するテーブルにキーを入力するときに、ポインターのアドレスを使用する予定です。
他のウィジェットを子として持つことができるウィジェットがあるとしましょう。Luaで2つのウィジェットを作成し、一方をもう一方の子として設定し、子ウィジェットへのすべてのlua参照を削除します(子であるという事実はC ++で処理されます)。これで、GCをいつでも実行して、子を削除できます。ただし、必ずしも子にデストラクタを実行させたくないので、shared_ptrにします。そうすれば、Luaがクリーンアップした後でも、C++オブジェクトはそれを使用できます。fenvに値または関数を割り当てた場合でも、それらにアクセスできるようにしたいです。子ウィジェットへの最後の参照が削除された場合にのみ、テーブル化されたfenvを完全に削除する必要があります。
c++ - 派生にデータメンバーがない場合、C++はまだ仮想デストラクタが必要ですか?
このコードがあるとします
仮想デストラクタが物事を適切に削除することは知っていますが、派生クラスに仮想関数とデータメンバーがなくても、(仮想デストラクタがない場合) ベースポインタで削除するのは悪いことですか? これが行われるとどうなりますか?
c++ - 特定の場合の仮想デストラクタの実際的な必要性
C ++ 03 5.3.5.3
最初の選択肢(オブジェクトの削除)では、オペランドの静的型が動的型と異なる場合、静的型はオペランドの動的型の基本クラスであり、静的型は仮想デストラクタを持っているか、動作が定義されていません。 。
これが理論です。ただし、問題は実際的なものです。派生クラスがデータメンバーを追加しない場合はどうなりますか?
質問:これが本当に危険な既存の実装はありますか? もしそうなら、このコードをクラッシュ/リークさせるような内部実装がどのように実装されているかを説明していただけますか?私はあなたに信じてもらいたい、私はこの振る舞いに頼るつもりはないことを誓う:)
c++ - エラー LNK2019 - 抽象クラスの仮想デストラクタ
重複の可能性:
C++ の純粋な仮想デストラクタ
2 つのクラスがあります。抽象「Game」クラスと派生した「TestGame」クラスです。TestGame のすべての関数は、(コンパイルできるようにするため) 個別に何も実装されていません。エラーが 1 つだけ発生します。
TestGame.obj : エラー LNK2019: 未解決の外部シンボル "public: virtual __thiscall Game::~Game(void)" (??1Game@@UAE@XZ) 関数で参照されている "public: virtual __thiscall TestGame::~TestGame(void) " (??1TestGame@@UAE@XZ)
ここに私のクラス定義があります:
私はいくつかのことを試しましたが、クラスの抽象化と派生の仕組みについて基本的な何かが欠けているのではないかと感じています。
c++ - デストラクタからの仮想関数の間接呼び出し
この免責事項を作成させてください。コンストラクタまたはデストラクタでの仮想関数呼び出しについて明確に理解しています。
以下のコードでは、実験的な目的でのみ仮想デストラクタを回避しようとしています。
今私の質問は:
主に Destroy fun の呼び出しは、適切な仮想関数を呼び出します。Destroy Function への呼び出しは、適切な仮想楽しみを呼び出す必要があると期待しています。
ただし、Base デストラクタ呼び出しに配置された同じ Destroy 関数は、Base 仮想関数です。
これは静的バインディングまたはコンパイラの最適化に関連していますか?
.
.
c++ - 仮想デストラクタを使用する場合、サブクラスごとに仮想デストラクタを明示的に宣言する必要がありますか?
抽象基本クラスの複数のレイヤーを使用して、やや深いオブジェクト指向コードを記述しているシナリオがあり、それぞれに対してデストラクタを明示的に宣言する必要があるかどうか疑問に思っています。
コンパイラーはすでに仮想化されているデフォルトのものを生成しますか、それとも私はそれを指示する必要がありますか?
c++ - デストラクタとPython
私はBase
C++でいくつかのクラスを持っています。boost::pythonを使用してPythonにエクスポートします。しかし、仮想デストラクタはどうですか?誤ったメモリ解放を回避するために、基本クラスには仮想デストラクタが必要です。私はそれを忘れて、Base
デストラクタなしで書きました。すべてが機能しますが、多くのメモリリークが発生します。
今私は追加しました:
そして、Pythonでモジュールをインポートした後、エラーが発生します。
ImportError:Base.so:未定義のシンボル:_ZTI6Base
私が間違っているのは何ですか?そして、私が理解しているように、エラーはpy-moduleのデストラクタエクスポータがないために発生します。