もちろん、最良の、または少なくとも最も単純な解決策は、ドキュメントです。
ただし、関数が malloc を使用していないことを確認したい場合は、malloc (およびその仲間である calloc、realloc、最終的には free) をラップして統計を収集します。
ラッパーの作成は、少なくとも dlsym(3) を使用できる場合は非常に簡単です (申し訳ありませんが、そのための Windows の方法はわかりません)。malloc のコードは次のとおりです。
void *malloc(size_t s) {
// Retrieve the pointer to the libc's malloc
// I use a static var to avoid time penality
static void* (*real_malloc)(size_t) = NULL;
if (!real_malloc) real_malloc = dlsym(RTLD_NEXT,"malloc");
stat.nmalloc += 1; // count malloc calls
stat.smalloc += s; // count malloced size
// You can also directly print malloc's parameters
// but you first need to check that stdio functions
// doesn't use malloc, or write your own printer
return real_malloc(s);
}
この例では、静的グローバル構造体を使用して、各関数の呼び出し回数と各呼び出しのサイズの合計を格納しています。ラッパー コードは、テスト コードとリンクできる小さなライブラリにあります (または、直接統計を出力する場合は、LD_PRELOAD を使用できます)。
結果は興味深いです。たとえば、fopen は malloc を使用しないと言いましたが、そのようなトリックを使用すると、それが誤りであることがわかります。たとえば、最近の 64 ビットの Linux システムでは、fopen を使用すると、568 バイトの malloc 呼び出しが 1 回発生しました ([編集] もちろん、解放は fclose で行われます)。