ってリストのすべての既存のvtables
-
27-09-2019 - |
質問
アダプタのご使用をおいてもボイド-ポイント(ここでは、歴史的な理由から、申請したC言語で書かれて).一つのモジュールのを知っているボイド-ポインタをポイントのインスタンスのクラスが継承から知られるベースラックスできませんが100になるようにして下さいます。そのため、dynamic_castにvoidポインタが課題です。が、それにvoidポインタでもポイントプレーン-struct(なvptrのstruct).
たいと思い調査の最初の4バイトのメモリにvoidポインタが指すため、このアドレスが有効であるvtable.ごきげんよう、トメ子です、ってもコンパイラのバージョン固有のもので助けてくれるの移動に応用して、くすべてのボイド-ポインタの限られた時期ということか3年を採用しております。
はしてもらえると助かりますの一覧を取得してvtablesプリケーションにはるかどうかをチェックポインタをポイントを有効にvtableのか、そのインスタンスを指vtableを継承知の拠点。
解決
いて調査の 4バイトのメモリにvoidポインタ はつが、この アドレスが有効であるvtable.
することができないし、何らの保証します。Y早くなんとかしない場合はvoid*ポイントのvtable.前回ったこと(5年前に思いくつかのコンパイラの保存のvtableポインタ 前 のアドレス"によって指定されたインスタンス*.
ごきげんよう、トメ子です、っ コンパイラのバージョン、
することもできるコンパイラオプションspecifficに応じて最適に使います。
られますが、いつまでたっても助けてくれを動かすために 申請は、とく すべてのボイド-ポイント以上 期間限定の期間(たとえば3 年間)。
このオプションがご覧に移動しての応用です。ている。
はしてもらえると助かりますの一覧を取得して vtables、アプリケーショ
No:(
はるかどうかをチェックポインタ ポイントの有効なvtable,
になってきています。よくお使いいただくためには一部クラスのポインタをお好みのデバッガ(またはキャストのメモリをバイトでログインでファイル)と比較してみることをいう。でも、いかなる保証その他データ(またはその他のポインタには同じような十分な時にキャストとしてバイト)を混乱させずコードします。
かるインスタンスを指 のvtableを継承知の拠点 クラス?
せん。
Faq(よくある質問(とうてい).それに対する回答しておりオプション、またはかりを与えてくれる、きわめてのアイデアの提案:
大きさはどのくらいのコードはマネタリーベースとしたのかで実施可能な導入をグローバル変更する機能の普及-頃ですか?
い扱うすべてのポインタを均一にする:はある共通ポイントをソースコードできるプラグインを追加ご自身のメタデータ?)
何ができるのです変更sourcecode?をする場合には、アクセスメモリ割り当て済みのサブルーチンはプラグインはご自分で用例することができるプラグイン独自のメタデータ).
と異なる場合データタイプにキャストvoid*様々な部品のコードをどのように決まりましたら、後でそのポインター?ご使用のコードを差別したりにvoid*かどうかを判断するためにその授業はありませんか?
あなたのコードベースをリファクタリング方法?(リファクタリングは小さな反復により、差し込む代替の実装部品のコード、削除、初期の実装および試験も)
編集 (提案した溶液):
次の手順:
を定義するメタデータ(ベース)クラス
交換メモリ割り当てルーチンとのカスタムもこだわりをご参照標準の旧ルーチンを確認コードが作品のカスタムルーチン).
各配分に割り当て
the requested size + sizeof(Metadata*)
(確認コードが作品を表現)をする場です。の交換 第
sizeof(Metadata*)
バイトの配分標準のバイトシーケンスが簡単に試験(私は一部を0xDEADBEEF:D).そこに戻っ[allocated address] + sizeof(Metadata*)
のアップにつながります。に解放し、ボイシ州立大学ポインター、減分で`sizeof(メタデータ*)そのシステム/前の日常の実行を解放.現在、 いいバッファを割り当てコードで、具体的には、データ毎の配分についての場合だとメタデータの作成/取得のメタデータのクラスのポインタ設定で0xDEADBEEFます。が必要な場合にチェックメタデータ
reinterpret_cast<Metadata*>([your void* here])
,減分で確認した場合のポインタ値が0xDEADBEEF(メタデータ)または、地下鉄からも近くて便利。
このコードするだけでよいのリファクタリング-生産コードでは、エラーや、一般的にはその他の悪いものない生産コードです。私はすべてこのコードの依存であ REFACTORING_SUPPORT_ENABLED
マクロのようなメタデータのクラスの光の量産リリースを除くの試験を築い).
他のヒント
私はそれが関連する基準(ヘッダ宣言)なしでは不可能であると思います。
場合は交換したい方にvoidポインタの正しいインタフェースの型が、こちらが思うんですけど自動化す:
を通ってコードベースのリストを取得するすべてのクラスは、仮想機能になにができることにより高速書きのスクリプトのように、Perl
する機能を取void*ポインタを入力として、繰り返し処理を実行し、また、それらの授業をしてみdynamic_castで、ログ情報が成功しなどのインタフェースの型コード線
この関数を呼び出でもどこでも使void*ポインタをかきなどで包んで、マクロで取得でき、ファイルライン情報を容易
走り、完全自動化している場合のみ)および分析の出力に出力します。
簡単な方法は、あなたの特定のベースクラスの過負荷operator new
になります。あなたはvoid *型のポインタは、ヒープのオブジェクトにしている知っていればその方法は、その後、あなたはまた、100%にするかどうか、彼らしているあなたのオブジェクトを指します。