問題タブ [vtable]
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++ - すべてのクラスには、コンパイラによって作成された Vtable がありますか?
VTable に関する多くのリソースがオンラインにあります。彼らは一般的にそれらに関して同じ声明を持っています:
"クラス自体が仮想関数を含むか、親クラスの仮想関数をオーバーライドするときはいつでも、コンパイラはそのクラスの vtable を作成します。これは、すべてのクラスがコンパイラによって作成された vtable を持っているわけではないことを意味します。vtable には、そのクラスの仮想関数。クラスごとに 1 つの vtable しか存在できず、同じクラスのすべてのオブジェクトが同じ vtable を共有します。 "
では、なぜこれは、すべてのクラスがコンパイラによって作成された vtable を持っているわけではないことを意味するのでしょうか? somc クラスに仮想関数がないからですか?
c++ - g++ -fdump-class-hierarchy の出力の最初の (int (*)(...))0 vtable エントリは何ですか?
このコードの場合:
コンパイル後、取得した vtableg++ -fdump-class-hierarchy
は次のとおりです。
(int ( )(...))0*のようなエントリが何に対応するのか理解できませんでした。もちろん、それは int を返し、無制限の数の引数を取る関数であることを意味します。それ以上はわかりません。この関数ポインタはどの関数に対応していますか? そして、どうやってそれを知っていますか?私のは64ビットマシンです。
2 番目の関数ポインターには、末尾に関連付けられたアドレスがありますか?? それは誰に該当しますか?
編集
私が使用するコンパイラはg ++です:
c++ - Win32 デバッグ ビルドで VTable ポインタが 0xdddddddd になる原因は何ですか?
私は欠陥をデバッグしており、それをオブジェクトの vtable ポインタに絞り込みました0xdddddddd
。 この回答は、Win32 デバッグ ビルドが通常、デッド メモリまたは削除されたメモリをこの特別な値に設定することを示しています。
ポインター自体は有効に見えることに注意してください0xdddddddd
。
コードのスニペットを次に示します。
アクセス違反の行でブレークして を監視すると、それ自体は有効なアドレス ( ) を持っていますが、メンバーは無効 ( )pMyObject
であることがわかります。pMyObject
0x08ede388
__vfptr
0xdddddddd
いくつかのメモ:
- これはシングル スレッド アプリケーションであるため、競合状態やミューテックスの問題ではない可能性が高いです。
- オブジェクトにアクセスする前に、コールスタックのさらに上のオブジェクトを削除するなどの明らかな問題はないようです。
- この問題は、Windows 2008 サーバーでのみ再現可能で、Windows 7 では再現できないようです。
これをさらにデバッグする方法について何か提案はありますか?
c++ - スロー例外オブジェクトとしての構造体基本クラス
直観は、スローされた型が単純であるほど良いことを教えてくれます。ポインターよりも int をスローする方が適切であり、クラスよりも構造体をスローする方が適切です。この場合、動的に割り当てられたメンバーを持つほぼ完全なクラスをスローする必要があります。バッファが非常に長くなり、コピーにコストがかかる可能性があるため、ヒープにメモリを割り当てると便利です。他のオブジェクトの制御/引数構造体として機能するため、メソッドを持つ必要はありませんが、構造体へのポインターをスローするためにヒープに構築することと、メモリをクリーンアップするためのデストラクタを持つことの両方が便利です。単純なほど良いので、デストラクタは仮想にする必要がありますか? vtable を省略した方が良いですか、それともvtables は例外の受け渡しにまったく影響しませんか?
この構造体からクラスを基本クラスとして派生させる利点は、ポリモーフ メソッドではなく、データを追加することです。ポインターは、例外ポイントから数層先でキャッチされ、モジュール間で渡される可能性があるため、オブジェクトは可能な限りクリーンに動作し、エラーを複合するリスクを可能な限り少なくする必要があります。
c++ - C++ 仕様では、非仮想クラスのインスタンスに vtable ポインター用のメモリを含めることが許可されていますか?
C++ 仕様では、非仮想クラスのインスタンスに vtable ポインター用のメモリを含めることが許可されていますか? 私がこれを尋ねているのは、同僚が以前 C++ コンパイラを使用した際に次のことが起こったと言ったからです。
次に、コードを次のように変更し、余分な単語を削除しました。
これらのタイプはどれも仮想ではなく、仮想のものから派生したものでもありません。したがって、おそらくこの特定のコンパイラは、構造体インスタンスではなく、クラス インスタンスの vptr にメモリを割り当てたという理論がありました。そのため、そのようなコンパイラの動作が仕様によって排除されているかどうかを判断しようとしています。
ありがとう!
ケン
c# - リフレクションを使用してC#の仮想メソッドテーブルをオーバーライドする
C#で仮想メソッドテーブルを変更する方法はありますか?仮想メソッドが指している場所を変更するようなものですか?
qt - Qt:シグナルとスロットエラー:`vtableforへの未定義の参照
このリンクからの次の例:http://developer.kde.org/documentation/books/kde-2.0-development/ch03lev1sec3.html
結果:
vtableは仮想関数用です、AFAIK、ここでのエラーの理由は何ですか?
c++ - C++ の仮想テーブルの構造は何ですか?
たとえば、2 つの「インターフェイス」とクラス タイプがあります。
type のインスタンスに対して vtab が実際に持っている構造は何Tester
ですか? そして、 演算子はdynamic_cast
どのように動作しますか(dynamic_cast
つまり、演算子が有効な参照型変換のためにvtabをスキャンする方法を意味します)式:
前もって感謝します!
com - IDA Pro で、構造体フィールドを .data セグメントで定義されている vtable にオフセットすることはできますか?
これが私が達成したいことです。クラス データを格納する構造体として定義したクラスを特定しました。クラスのメソッドの 1 つは、class-field を vtable へのポインタであるかのように使用します。
ご覧のとおり、vtable から 3 番目の関数を呼び出します。実行時に、vtable_40194AE0 が次のような .data セクションの配列を指していることを確認しました
vtable_40194AE0 が常に 0x40194AE0 の vtable を指していることを何らかの方法で IDA に伝える方法はありますか?
?
構造体の vtable_40194AE0 を「ユーザー定義のオフセット」に設定しようとしましたが、役に立ちません:(
どうもありがとう !
c++ - C ++クラスにvtableがあるかどうかを判断するにはどうすればよいですか?
私の友人は、今日、私に次のチャレンジを送ってくれました。
次のコードを前提として
OBJECT_HAS_VTABLE
、プログラムがを出力するようにの実装を提案しますAnObject has a vtable = 0, AnObjectWithVTable has a vtable = 1
。
私は私が十分にまともだと思う次の解決策を思いついた:
この問題に対するより良い解決策はありますか?
編集
ソリューションは、すべてのコンパイラで一般的である必要はありません。gcc、g ++、MSVCで動作します...ソリューションが有効であることがわかっているコンパイラを指定するだけです。鉱山はMSVC2010用です。