0

したがって、私が抱えている大きな問題の 1 つは、C/C++ の特定の関数がメモリ割り当てを行うかどうかを判断することです。私は頻繁に外部ライブラリを使用します。その中には、新しいオブジェクトへのポインターを返す関数があるものもあります。何かがメモリを割り当てた場合に事前に通知する基本的な設計パラダイムまたは規則はありますか?

新しいオブジェクトへのポインタを返す関数はメモリを割り当てなければならないように思えますが、常にそうであるとは限りません。たとえば、fopen は

編集:明確にするために、ソースコードにアクセスできないため、newまたはmallocなどを使用しているかどうかを確認することはできません。

4

4 に答える 4

3

使用するすべてのライブラリのドキュメントをお読みください。特定のものを解放する必要があるかどうかを教えてくれるはずです。

于 2013-08-09T20:13:45.567 に答える
0

もちろん、最良の、または少なくとも最も単純な解決策は、ドキュメントです。

ただし、関数が 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 で行われます)。

于 2013-08-09T22:45:45.290 に答える
0

C++ の場合、new または new [] を呼び出すものはすべてメモリを割り当てます。したがって、関数は、それらを呼び出すか、new を呼び出す関数 (任意の関数を呼び出すなど) を呼び出す場合に実行します。

呼び出しが malloc、calloc、および family であることを除いて、C でも同じです。

于 2013-08-09T20:14:40.507 に答える