пример fread из C ++ - PullRequest
       44

пример fread из C ++

2 голосов
/ 30 января 2009

Я часто использую веб-сайт www.cplusplus.com в качестве справочного материала при написании кода C.

Я читал приведенный на странице пример для 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;
}

Мне кажется, что если результат! = LSize, то free (buffer) никогда не будет вызываться. Будет ли это утечка памяти в этом примере?

Я всегда думал, что примеры на их сайте очень высокого качества. Возможно, я не правильно понимаю?

Ответы [ 6 ]

4 голосов
/ 30 января 2009

Это не будет утечка памяти в этом примере , потому что завершение программы (путем вызова exit()) освобождает всю связанную с ней память.

Однако, если вы используете этот фрагмент кода в качестве подпрограммы и будете называть что-то вроде return 1; вместо exit().

, будет утечка памяти.
4 голосов
/ 30 января 2009

Технически, да, это утечка памяти. Но любая память, выделенная процессом, автоматически освобождается, когда этот процесс завершается, поэтому в этом примере вызовы free (и fclose) на самом деле не требуются.

В более сложной программе это, вероятно, будет настоящей проблемой. Отсутствие свободного места приведет к утечке памяти, а отсутствие fclose приведет к утечке ресурса.

0 голосов
/ 30 января 2009

Что касается возможной утечки памяти, другие уже ответили на этот вопрос. Некоторое время назад я опубликовал вариант данного кода, который должен правильно обрабатывать все возможные состояния ошибки:

0 голосов
/ 30 января 2009

Есть два возможных пути.

(1) result! = LSize - в этом случае вызывается exit (0). Это убивает процесс, и операционная система очистит память.

(2) result == lsize - в этом случае буфер явно освобождается, но return вызывается сразу после этого, так что free - это в основном просто хороший стиль, потому что это также убивает процесс, и операционная система, опять же, очищает до памяти.

Так что в этом простом случае утечки памяти нет. Но, вероятно, хорошей практикой будет просто убедиться, что вы освобождаете любую память, выделенную в любом приложении, которое вы пишете. Попадание в эту привычку избавит вас от многих головных болей в будущем.

0 голосов
/ 30 января 2009

Если программа не закрывалась в точке результата! = LSize, то есть продолжалась с другим путем выполнения, тогда да - это гарантированная утечка памяти.

0 голосов
/ 30 января 2009

Операционная система очищает любую неосвобожденную память процессом, когда этот процесс закрывается. По крайней мере, современные операционные системы делают.

...