12

重複の可能性:
Cのポインターから配列のサイズを取得するにはどうすればよいですか?
プログラムでC++配列のサイズを決定する方法はありますか?そうでない場合は、なぜですか?

Cスタイルの関数から割り当てられたメモリのチャンクへのポインタを取得します。さて、このポインタが指す割り当てられたメモリブロックの大きさを知ることは、デバッグの目的で非常に興味深いでしょう。

盲目的にその境界を越えて例外を引き起こすことよりもエレガントなものはありますか?

よろしくお願いします、アンドレアス

編集:

WindowsではVC++2005を使用し、LinuxではGCC4.3を使用しています

EDIT2:

私は_msizeVC++2005を使用していますが、残念ながらデバッグモードで例外が発生します。

EDIT3:

上手。例外を除いて、上記の方法を試しましたが、機能します。少なくとも、デバッグを行っている間は、ライブラリの呼び出しが終了した直後に、バッファの境界を越えて実行されていることを確認しています。チャームのように機能します。

エレガントではなく、本番コードではまったく使用できません。

4

9 に答える 9

4

Valgrind の memcheckGoogle の TCMalloc (ヒープ チェッカー部分)などのメモリ チェッカーは、この種のものを追跡します。

TCMalloc を使用して、割り当てられた場所を示すヒープ プロファイルをダンプするか、SameHeap()を使用して、プログラム実行の 2 つの時点でヒープが同じであることを確認することができます。

于 2009-07-30T19:13:27.593 に答える
2

部分的な解決策: Windows では、PageHeapを使用して、割り当てられたブロック外のメモリ アクセスをキャッチできます。

PageHeap は、Windows カーネルに存在する代替メモリ マネージャーです (NT の種類ですが、最近では他のバージョンを使用する人はいません)。プロセス内のすべての割り当てを取得し、その末尾がメモリ ページの末尾に揃えられたメモリ ブロックを返します。その後、次のページにアクセスできなくなります (読み取りも書き込みもアクセスできません)。プログラムがブロックの末尾を超えて読み書きしようとすると、お気に入りのデバッガーでキャッチできるアクセス違反が発生します。

入手方法: Microsoft から Windows 用デバッグ ツール パッケージをダウンロードしてインストールします: http://www.microsoft.com/whdc/devtools/debugging/default.mspx

次に GFlags ユーティリティを起動し、3 番目のタブに移動して実行可能ファイルの名前を入力し、キーを押します。PageHeap チェックボックスをオンにして、[OK] をクリックすると、準備完了です。

最後に、デバッグが完了したら、GFlags を再度起動し、アプリケーションの PageHeap を無効にすることを忘れないでください。GFlags はこの設定をレジストリ (HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ の下) に入力するため、再起動しても保持されます。

また、PageHeap を使用すると、アプリケーションのメモリ ニーズが大幅に増加する可能性があることに注意してください。

于 2009-07-30T20:12:50.063 に答える