質問
ある変数へのポインタが与えられた場合..静的に割り当てられたか動的に割り当てられたかを確認する方法はありますか?
解決
コメントからの引用:
基本的に構造体を取り除くメソッドを作成しています。それは、mallocされるかもしれないし、されないかもしれない何かへのポインタであるデータメンバーを持っています。
正しい方法は、別のメンバーを構造体に追加することです:割り当て解除関数へのポインタ。
これは、単なる静的割り当てと動的割り当てではありません。可能なアロケーターはいくつかありますが、 malloc()
は1つだけです。
Unixライクシステムでは、次のようになります。
- 静的変数
- スタック上
- スタック上にあるが動的に割り当てられている(つまり
alloca()
) - ヒープ上で、
malloc()
で割り当てられます
- ヒープ上で、
new
で割り当てられます
- ヒープ上、
new []
で割り当てられた配列の中央
- ヒープ上で、
malloc()
で割り当てられた構造体内
- ヒープ上で、
new
で割り当てられたオブジェクトの基本クラス内
-
mmap
で割り当てられます
- カスタムアロケーターで割り当てられた
- 上記のいくつかの組み合わせやバリエーションを含む多くのオプション
Windowsには、いくつかのランタイム、 LocalAlloc
、 GlobalAlloc
、 HeapAlloc
(簡単に作成できるいくつかのヒープがある)、およびなど。
使用したアロケーターの正しいリリース機能を使用して、常にメモリを解放する必要があります。そのため、メモリの割り当てを担当するプログラムの一部もメモリを解放するか、メモリを解放するコードに正しいリリース関数(またはその周りのラッパー)を渡す必要があります。
また、特定のアロケーターを使用して常にポインターを割り当てることを要求するか、自分でアロケーターを提供することにより(メモリを割り当てる関数と、場合によっては解放する関数の形式で)、問題全体を回避することもできます。アロケーターを自分で提供する場合は、トリック(タグ付きポインターなど)を使用して、静的割り当ても使用できるようにすることもできます(ただし、このアプローチの詳細はここでは説明しません)。
Raymond Chen にブログ投稿があります(Windows中心ですが、概念はどこでも同じ):モジュールの境界を越えたメモリの割り当てと解放
他のヒント
ACE ライブラリは、これをあらゆる場所で実行します。あなたは彼らがそれをどうするかをチェックできるかもしれません。一般的に、おそらく最初にこれを行う必要はないはずです...
ヒープ、スタック、および静的データ領域は通常、さまざまなメモリ範囲を占有するため、プロセスメモリマップを熟知していれば、アドレスを調べて、どの割り当て領域にあるかを判断できます。この手法アーキテクチャとコンパイラ固有の両方であるため、コードの移植がより困難になります。
ほとんどのlibc malloc実装は、ブロックのサイズに関する情報と「マジック」値を持つフィールド(free()呼び出しで使用される)が返される各メモリブロックの前にヘッダーを格納することによって機能します。この魔法の値は、ユーザーが誤って割り当てられていないポインターを削除する(または、ユーザーによって上書きされたブロックを解放する)のを防ぐためです。これは非常にシステム固有であるため、libcライブラリの実装を調べて、どのような魔法の価値があるかを正確に確認する必要があります。
それを知ったら、与えられたポインターをヘッダーに戻し、マジック値をチェックします。
LD_PRELOADなどを使用して、mallocデバッガーが行うようにmalloc()自体にフックできますか?その場合、割り当てられたすべてのポインターのテーブルを保持し、それを使用できます。そうでなければ、私にはわかりません。 mallocの簿記情報を取得する方法はありますか?
標準機能ではありません。
mallocライブラリのデバッグバージョンには、これを行うための何らかの機能がある場合があります。
そのアドレスを静的であることがわかっているものと比較し、遠くにある場合にのみ割り当てられていると言うことができます。それ。
1。)所有しているコードのマップファイルを取得します。
2。)基盤となるプロセス/ハードウェアターゲットプラットフォームには、通常、メモリの開始アドレス(スタック、ヒープ、グローバル0、そのブロックのサイズ、そのメモリブロックの読み取り/書き込み属性)を示すメモリマップファイルが必要です。
3。)1.)のmaoファイルからオブジェクトのアドレス(ポインター変数)を取得した後、そのアドレスがどのブロックに属するかを確認します。アイデアが得られるかもしれません。
= AD