問題タブ [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.

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

c++ - すべてのクラスには、コンパイラによって作成された Vtable がありますか?

VTable に関する多くのリソースがオンラインにあります。彼らは一般的にそれらに関して同じ声明を持っています:

"クラス自体が仮想関数を含むか、親クラスの仮想関数をオーバーライドするときはいつでも、コンパイラはそのクラスの vtable を作成します。これは、すべてのクラスがコンパイラによって作成された vtable を持っているわけではないことを意味します。vtable には、そのクラスの仮想関数。クラスごとに 1 つの vtable しか存在できず、同じクラスのすべてのオブジェクトが同じ vtable を共有します。 "

では、なぜこれは、すべてのクラスがコンパイラによって作成された vtable を持っているわけではないことを意味するのでしょうか? somc クラスに仮想関数がないからですか?

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

c++ - g++ -fdump-class-hierarchy の出力の最初の (int (*)(...))0 vtable エントリは何ですか?

このコードの場合:

コンパイル後、取得した vtableg++ -fdump-class-hierarchyは次のとおりです。

(int ( )(...))0*のようなエントリが何に対応するのか理解できませんでした。もちろん、それは int を返し、無制限の数の引数を取る関数であることを意味します。それ以上はわかりません。この関数ポインタはどの関数に対応していますか? そして、どうやってそれを知っていますか?私のは64ビットマシンです。

2 番目の関数ポインターには、末尾に関連付けられたアドレスがありますか?? それは誰に該当しますか?

編集

私が使用するコンパイラはg ++です:

0 投票する
4 に答える
15113 参照

c++ - Win32 デバッグ ビルドで VTable ポインタが 0xdddddddd になる原因は何ですか?

私は欠陥をデバッグしており、それをオブジェクトの vtable ポインタに絞り込みました0xddddddddこの回答は、Win32 デバッグ ビルドが通常、デッド メモリまたは削除されたメモリをこの特別な値に設定することを示しています。

ポインター自体は有効に見えることに注意してください0xdddddddd

コードのスニペットを次に示します。

アクセス違反の行でブレークして を監視すると、それ自体は有効なアドレス ( ) を持っていますが、メンバーは無効 ( )pMyObjectであることがわかります。pMyObject0x08ede388__vfptr0xdddddddd

いくつかのメモ:

  • これはシングル スレッド アプリケーションであるため、競合状態やミューテックスの問題ではない可能性が高いです。
  • オブジェクトにアクセスする前に、コールスタックのさらに上のオブジェクトを削除するなどの明らかな問題はないようです。
  • この問題は、Windows 2008 サーバーでのみ再現可能で、Windows 7 では再現できないようです。

これをさらにデバッグする方法について何か提案はありますか?

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

c++ - スロー例外オブジェクトとしての構造体基本クラス

直観は、スローされた型が単純であるほど良いことを教えてくれます。ポインターよりも int をスローする方が適切であり、クラスよりも構造体をスローする方が適切です。この場合、動的に割り当てられたメンバーを持つほぼ完全なクラスをスローする必要があります。バッファが非常に長くなり、コピーにコストがかかる可能性があるため、ヒープにメモリを割り当てると便利です。他のオブジェクトの制御/引数構造体として機能するため、メソッドを持つ必要はありませんが、構造体へのポインターをスローするためにヒープに構築することと、メモリをクリーンアップするためのデストラクタを持つことの両方が便利です。単純なほど良いので、デストラクタは仮想にする必要がありますか? vtable を省略した方が良いですか、それともvtables は例外の受け渡しにまったく影響しませんか?

この構造体からクラスを基本クラスとして派生させる利点は、ポリモーフ メソッドではなく、データを追加することです。ポインターは、例外ポイントから数層先でキャッチされ、モジュール間で渡される可能性があるため、オブジェクトは可能な限りクリーンに動作し、エラーを複合するリスクを可能な限り少なくする必要があります。

0 投票する
4 に答える
322 参照

c++ - C++ 仕様では、非仮想クラスのインスタンスに vtable ポインター用のメモリを含めることが許可されていますか?

C++ 仕様では、非仮想クラスのインスタンスに vtable ポインター用のメモリを含めることが許可されていますか? 私がこれを尋ねているのは、同僚が以前 C++ コンパイラを使用した際に次のことが起こったと言ったからです。

次に、コードを次のように変更し、余分な単語を削除しました。

これらのタイプはどれも仮想ではなく、仮想のものから派生したものでもありません。したがって、おそらくこの特定のコンパイラは、構造体インスタンスではなく、クラス インスタンスの vptr にメモリを割り当てたという理論がありました。そのため、そのようなコンパイラの動作が仕様によって排除されているかどうかを判断しようとしています。

ありがとう!

ケン

0 投票する
4 に答える
2523 参照

c# - リフレクションを使用してC#の仮想メソッドテーブルをオーバーライドする

C#で仮想メソッドテーブルを変更する方法はありますか?仮想メソッドが指している場所を変更するようなものですか?

0 投票する
5 に答える
37574 参照

qt - Qt:シグナルとスロットエラー:`vtableforへの未定義の参照

このリンクからの次の例:http://developer.kde.org/documentation/books/kde-2.0-development/ch03lev1sec3.html

結果:

vtableは仮想関数用です、AFAIK、ここでのエラーの理由は何ですか?

0 投票する
4 に答える
9581 参照

c++ - C++ の仮想テーブルの構造は何ですか?


たとえば、2 つの「インターフェイス」とクラス タイプがあります。

type のインスタンスに対して vtab が実際に持っている構造は何Testerですか? そして、 演算子はdynamic_castどのように動作しますか(dynamic_castつまり、演算子が有効な参照型変換のためにvtabをスキャンする方法を意味します)式:

前もって感謝します!

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

com - IDA Pro で、構造体フィールドを .data セグメントで定義されている vtable にオフセットすることはできますか?

これが私が達成したいことです。クラス データを格納する構造体として定義したクラスを特定しました。クラスのメソッドの 1 つは、class-field を vtable へのポインタであるかのように使用します。

ご覧のとおり、vtable から 3 番目の関数を呼び出します。実行時に、vtable_40194AE0 が次のような .data セクションの配列を指していることを確認しました

vtable_40194AE0 が常に 0x40194AE0 の vtable を指していることを何らかの方法で IDA に伝える方法はありますか?

?

構造体の vtable_40194AE0 を「ユーザー定義のオフセット」に設定しようとしましたが、役に立ちません:(

どうもありがとう !

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

c++ - C ++クラスにvtableがあるかどうかを判断するにはどうすればよいですか?

私の友人は、今日、私に次のチャレンジを送ってくれました。

次のコードを前提としてOBJECT_HAS_VTABLE、プログラムがを出力するようにの実装を提案しますAnObject has a vtable = 0, AnObjectWithVTable has a vtable = 1

私は私が十分にまともだと思う次の解決策を思いついた:

この問題に対するより良い解決策はありますか?

編集

ソリューションは、すべてのコンパイラで一般的である必要はありません。gcc、g ++、MSVCで動作します...ソリューションが有効であることがわかっているコンパイラを指定するだけです。鉱山はMSVC2010用です。