9

のアドレスを指す変数aとポインタがあるとします。pa

int a;
int *p=&a;

変数の場所を指すポインタがあるので、正確なメモリの場所 (またはメモリのチャンク) がわかります。

私の質問は次のとおりです。

  1. アドレスが与えられた場合、それらを使用している変数を見つけることができますか? (私はこれが可能だとは思わない)。
  2. アドレスが与えられた場合、少なくともそのメモリアドレスが属するメモリのチャンクの大きさを知ることができますか? (これがばかげていることはわかっていますが、それでも)。
4

4 に答える 4

3
  1. すべての(疑わしい)変数を列挙し、それらがポインターと同じ場所を指しているかどうかを確認できます(たとえば、ポインターが等しいかどうかを比較できます)
  2. ポインターが int *p として定義されている場合、整数を指していると想定できます。もちろん、たとえばポインター値が null であるか、ポインターの値をいじった場合、あなたの仮定が間違っていることが証明される可能性があります。
于 2012-11-06T10:54:15.453 に答える
2

メモリはバイトの大きな配列と考えることができます。

配列の途中にポインタがある場合、ポインタと同じ場所を指している他のポインタがいくつあるか教えてください。それとも、あなたがそれを指しているメモリの場所に私が保存した情報の量を教えてもらえますか?または、少なくともポインタの場所に保存されているオブジェクトの種類を教えていただけますか?この質問のすべてに答えることは本当に不可能であり、質問は奇妙に見えます。一部の言語は、後でそのような情報を追跡できるようにメモリ管理ルーチンに追加情報を追加しますが、C ++ではオーバーヘッドが最小であるため、答えは不可能です。

最初の質問では、スマートポインターを使用して処理できます。たとえばshared_ptr、参照カウンターを使用しshared_ptrて、メモリ位置を指している数を把握し、オブジェクトの寿命を制御できます(ただし、の現在の設計でshared_ptrは、それを読み取ることはできません。カウンター)。

動的に割り当てられたメモリのサイズをクエリするための非標準のプラットフォーム依存ソリューションがありますが(たとえば_msize、Windowsやmemory_sizeUnix)、それは、移植性がなく、を使用して割り当てられた動的メモリでのみ機能しmallocます。C++では、これに注意する必要があります。この機能が必要な場合は、そのソリューションを実装し、必要がない場合は、追加のコストを支払う必要はありません。

于 2012-11-06T11:13:04.457 に答える
2

アドレスが与えられた場合、どの変数がそれらを使用しているかを見つけることができますか?

いいえ、これは不可能です。変数はメモリを指しますが、その逆ではありません。コンパイルされたコードから変数名を取得する方法はありませんが、おそらくシンボル テーブルを介して読み取る場合を除いて、アセンブリをいじる必要があるでしょう。


アドレスが与えられた場合、そのメモリアドレスが属するメモリのチャンクの大きさを少なくとも見つけることができますか..

いいえ。住所だけではそれを行う方法はありません。アドレスを逆参照した後にsizeof()を見つけることができましたが、アドレス自体からではありませんでした。

于 2012-11-06T10:50:17.633 に答える
1

質問 1.
A:ネイティブでは実行できませんが、Valgrind memcheck ツールで実行できます。VM は、すべての変数と割り当てられたメモリ領域/スタックを追跡します。ただし、そのような質問に答えるようには設計されていませんが、memcheck ツールを変更すると、この質問に答えることができます。たとえば、無効なメモリ アクセスやメモリ リーク アドレスをソース コード内の変数に関連付けることができます。したがって、有効で既知のメモリ アドレスが与えられた場合、対応する変数を見つけることができなければなりません。

質問 2.
A:malloc上記のように実行できますが、callocstrdup、 、 などの PRELOADED ライブラリを使用してネイティブに実行することもできますfree。手動で指示されたメモリ割り当て機能により、割り当てられたアドレスとサイズを節約できます。また、メモリチャンクがどこに割り当てられている__builtin_return_address()かを知るために、リターンアドレスを保存します。backtrace()割り当てられたすべてのアドレスとサイズをツリーに保存する必要があります。次に、アドレスがどのチャンクに属しているか、チャンクサイズ、およびどの関数がチャンクを割り当てたかを照会できるはずです。

于 2012-11-06T13:11:06.873 に答える