Pergunta

Costumo usar o site www.cplusplus.com como referência quando escrever código C.

Eu estava lendo o exemplo citado na página para fread e tinha uma pergunta.

Como exemplo eles postam:

/* 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;
}

Parece-me que que se o resultado! = LSize, então livre (tampão) nunca obter chamado. Isso seria um vazamento de memória neste exemplo?

Eu sempre pensei que os exemplos em seu site são de muito alta qualidade. Talvez eu não estou entendendo corretamente?

Foi útil?

Solução

Não seria um vazamento de memória neste exemplo , porque encerra o programa (chamando exit()) libera toda a memória associada a ele.

No entanto, seria um vazamento de memória se você usou este pedaço de código como uma sub-rotina e chamado algo como return 1; no lugar de exit().

Outras dicas

Tecnicamente, sim, é um vazamento de memória. Mas qualquer memória alocada por um processo é automaticamente liberada quando que termina processo, portanto, neste exemplo, as chamadas para livre (e fclose) não são realmente necessários.

Em um programa mais complexo, este provavelmente seria um problema real. A falta livres criaria um vazamento de memória eo fclose faltando poderia causar um vazamento de recursos.

O sistema operacional limpa qualquer memória não-liberto por um processo quando esse processo se fecha. Pelo menos, moderna sistemas operacionais fazer.

Se o programa não estavam saindo com o resultado ponto = lSize, ou seja, ele continuou com algum outro caminho de execução, então sim -. É um vazamento de memória garantida

Existem dois caminhos possíveis.

(1) result = lSize - neste caso, exit (0) é chamado. Isso mata o processo e o sistema operacional irá limpar a memória.

(2) resultado == lSize - neste caso, o tampão é explicitamente liberado, mas retorno é chamada logo em seguida para que o livre é na maior parte apenas bom estilo, porque isso também mata o processo eo sistema operacional irá, novamente, limpo a memória.

Portanto, neste caso simples, não há vazamento de memória. Mas é provavelmente uma boa prática para apenas certifique-se que você está liberando qualquer memória que você alocado em qualquer aplicação que você escreve. Chegar a este hábito irá evitar muitas dores de cabeça para você no futuro.

Como a possíveis vazamentos de memória, outras de ter já respondido a essa pergunta. Um tempo atrás, eu postei uma variação do código dado que deve lidar com todas as condições de erro possíveis corretamente:

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top