3

私は C を使用して Unix/Linux で作業しています。メモリ割り当てがどのように機能するかについての基本的な理解があり、malloc() の後に free() を実行すると、実際にはページ全体を解放する可能性が低いことを十分に理解しています。したがって、free() の前後で getrusage() を使用しても、おそらく違いは見られません。

関連するメモリ領域が実際に解放されたことを確認するために、データ構造を破壊する関数の単体テストを書きたいと思います。私は OS に依存するソリューションに対してオープンです。この場合、私のプライマリ プラットフォームは

Linux beast 3.2.0-23-generic #36-Ubuntu SMP Tue Apr 10 20:39:51 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

OS X とFreeBSDをセカンダリとして使用します。また、free() を比較的簡単にチェックできる解決策があれば、代わりに malloc() を使用することもできます。

明確にするために、私は大きなデータ構造を削除するルーチンをテストしています。割り当てられたすべての領域が実際に解放されていることを確認したいのですが、本質的には、特定のユニットに基本的なメモリ リークがないことを単体テストします。 . free() がその役割を果たしていると仮定します。コードが担当する割り当てられたすべての領域で実際に free を呼び出していることを確認しているだけです。

この特定のケースでは、それはツリー構造であり、ツリー内の各データに対して、構造は、ツリーに保存されているデータも削除するルーチンを呼び出す責任があります。これは、他の任意のものである可能性があります...

4

4 に答える 4

2

私の最善の提案は、を使用することvalgrindです。

彼らは malloc と free のラッパーを作成し、自家製のシステムで行うよりもメモリ リークを改善します。また、初期化されていない変数などの単体テストでは簡単に発見およびテストできない、あらゆる種類の他のエラーをキャッチします。

したがって、常に valgrind を使用してテストを実行し、すべてのテストに合格し、valgrind がエラーや未割り当てのメモリを示さないことを成功基準にしてください。

PS: すでにコードベースが少しある場合は、開始するのに少し苦労するかもしれませんが、時間をかけてすべての valgrind エラーを修正すれば、テストとシステムの両方の信頼性が大幅に向上します!

于 2012-12-01T11:20:11.850 に答える
2

私はこれをもう一度やりたくないのですが、一晩寝た後、明確な答えを見つけました。それはSVIDからのものです(システムVを覚えている人はいますか?)が、おそらくdlmallocでの使用を通じて、Linuxのglibcに組み込まれています。したがって、dlmalloc() を代用 malloc のドロップとして使用することにより、他のシステムで使用できます。

ルーチンを使用する

struct mallinfo mallinfo(void);

構造体 mallinfo は

struct mallinfo
{
  int arena;    /* non-mmapped space allocated from system */
  int ordblks;  /* number of free chunks */
  int smblks;   /* number of fastbin blocks */
  int hblks;    /* number of mmapped regions */
  int hblkhd;   /* space in mmapped regions */
  int usmblks;  /* maximum total allocated space */
  int fsmblks;  /* space available in freed fastbin blocks */
  int uordblks; /* total allocated space */
  int fordblks; /* total free space */
  int keepcost; /* top-most, releasable (via malloc_trim) space */
};

特に arena と uordblks は、sbrk() または mmap() を使用して OS から要求されたページのサイズとは無関係に、malloc() によって割り当てられたバイト数を示します。

于 2012-07-11T16:10:49.650 に答える