2

私はCコードを書くときの参照としてウェブサイトwww.cplusplus.comをよく使用します。

このページで引用されているfreadの例を読んでいて、質問がありました。

例として、彼らは投稿します:

/* fread example: read a complete file */
#include <stdio.h>
#include <stdlib.h>

int main () {
  FILE * pFile;
  long lSize;
  char * buffer;
  size_t result;

  pFile = fopen ( "myfile.bin" , "rb" );
  if (pFile==NULL) {fputs ("File error",stderr); exit (1);}

  // obtain file size:
  fseek (pFile , 0 , SEEK_END);
  lSize = ftell (pFile);
  rewind (pFile);

  // allocate memory to contain the whole file:
  buffer = (char*) malloc (sizeof(char)*lSize);
  if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}

  // copy the file into the buffer:
  result = fread (buffer,1,lSize,pFile);
  if (result != lSize) {fputs ("Reading error",stderr); exit (3);}

  /* the whole file is now loaded in the memory buffer. */

  // terminate
  fclose (pFile);
  free (buffer);
  return 0;
}

result!= lSizeの場合、free(buffer)が呼び出されることはないように思われます。この例では、これはメモリリークでしょうか?

私はいつも彼らのサイトの例は非常に高品質だと思っていました。おそらく私は正しく理解していませんか?

4

6 に答える 6

4

技術的には、はい、それはメモリリークです。ただし、プロセスによって割り当てられたメモリは、そのプロセスが終了すると自動的に解放されるため、この例では、free(およびfclose)の呼び出しは実際には必要ありません。

より複雑なプログラムでは、これはおそらく実際の問題になります。空きがない場合はメモリリークが発生し、fcloseがない場合はリソースリークが発生します。

于 2009-01-29T22:05:37.503 に答える
4

この例では、プログラムを(呼び出すことによってexit())終了すると、それに関連するすべてのメモリが解放されるため、メモリリークにはなりません。

return 1;ただし、このコードをサブルーチンとして使用し、の代わりにのようなものを呼び出すと、メモリリークが発生しますexit()

于 2009-01-29T22:06:34.507 に答える
0

オペレーティングシステムは、プロセスが閉じたときに、プロセスによって解放されていないメモリをクリーンアップします。少なくとも、最新のオペレーティングシステムはそうです。

于 2009-01-29T22:04:01.237 に答える
0

プログラムがポイント結果!= lSizeで終了していなかった場合、つまり、他の実行パスでプログラムが続行された場合は、はい-メモリリークが保証されています。

于 2009-01-29T22:05:13.573 に答える
0

2 つの可能なパスがあります。

(1) result != lSize - この場合、exit(0) が呼び出されます。これによりプロセスが強制終了され、オペレーティング システムがメモリをクリーンアップします。

(2) result == lsize - この場合、バッファは明示的に解放されますが、return はその後すぐに呼び出されるため、これもプロセスを強制終了し、オペレーティング システムが再びメモリをクリーンアップするため、解放はほとんど良いスタイルです。 .

したがって、この単純なケースでは、メモリ リークはありません。ただし、作成したアプリケーションで割り当てたメモリを解放していることを確認することは、おそらく良い習慣です。この習慣を身につけることで、将来の多くの頭痛を防ぐことができます。

于 2009-01-29T22:11:51.987 に答える
0

メモリリークの可能性については、他の人がすでにその質問に答えています。しばらく前に、考えられるすべてのエラー状態を正しく処理する必要がある特定のコードのバリエーションを投稿しました。

于 2009-01-29T22:22:08.487 に答える