このように、Valgrindのような優れたツールが既に存在します。
さらに:私はこれは面白いですし、私が果たすことになると確信して練習
のために、任意の外部のユーティリティせずにこれを実行したいと思い
、
あなたは、このようなメモリ使用量を検出するために、マクロのトリックを使用することができますし、リークエラー、実際にはあなた自身のきれいなリークディテクタを書いてください。あなたは、あなたのプロジェクトで単一の割り当てと割り当て解除機能を持っている限り、これを行うことができます。
#define malloc(X) my_malloc(X, __FILE__, __LINE__, __FUNCTION__)
void* my_malloc(size_t size, const char *file, int line, const char *func)
{
void *p = malloc(size);
printf ("Allocated = %s, %i, %s, %p[%li]\n", file, line, func, p, size);
/*Link List functionality goes in here*/
return p;
}
リンクされたアドレスのリストは、割り当てられたファイルと行番号で維持されます。 malloc
のエントリでリンクリストを更新します。
上記と同様に、free
の実装を書くことができます。ここでは、リンクされたリストに対して解放するように求められるアドレスエントリを確認します。一致するエントリがない場合、その使用エラーが発生しており、それにフラグを立てることができます。
プログラムの最後に、リンクリストの内容をログファイルに出力します。リークがない場合は、リンクされたリストにエントリがないはずですが、いくつかのリークがあった場合、ログファイルは、メモリが割り当てられた場所の正確な場所を示します。
このマクロトリックを使用すると、どの機能が提供するタイプチェックが失われることに注意してください。しかし、私は多くの時間を使います。
希望はこのことができますし、すべてのベスト、あなたのソースコードで呼び出しをラップしますあなたは、GNU ld
を使用している場合、あなたはリンカがすべての呼び出しをラップすることができます@アルスの答えに加えて:)
Valgrindには何が問題なのですか? –
@MitchWheat私は外部のユーティリティを使用することはできません。 –
これは学習のためのものであれば、valgrindがどのようにそれを行うのかを学ぶことができます... –