Utilizo a menudo el sitio web www.cplusplus.com como referencia a la hora de escribir código C.

Estaba leyendo el ejemplo citado en la página de fread y tenía una pregunta.

Como un ejemplo de que el post:

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

A mí me parece que si el resultado != lSize, entonces libre(buffer) nunca será llamado. Sería una pérdida de memoria en este ejemplo?

Siempre he pensado que los ejemplos en su sitio son de una calidad muy alta. Tal vez no estoy entendiendo bien?

OriginalEl autor Tim | 2009-01-29

6 Comentarios

  1. 4

    No sería una pérdida de memoria en este ejemplo, porque terminando el programa (llamando exit()) libera la memoria asociada con él.

    Sin embargo, sería una pérdida de memoria si utiliza este trozo de código como una subrutina y se llama algo así como return 1; en lugar de exit().

    OriginalEl autor jpalecek

  2. 4

    Técnicamente, sí es una pérdida de memoria. Pero cualquier memoria asignada a un proceso se libera automáticamente cuando el proceso termina, por lo que en este ejemplo las llamadas de conexión (y fclose) no son realmente necesarios.

    En un programa más complejo, es probable que esto sea un problema real. La falta de libre crearía una pérdida de memoria y la falta fclose podría causar una pérdida de recursos.

    OriginalEl autor Ferruccio

  3. 0

    El sistema operativo limpia cualquier unfreed de memoria de un proceso cuando ese proceso se cierra. Al menos, moderno sistemas operativos.

    OriginalEl autor strager

  4. 0

    Si el programa no fueron saliendo en el punto en el resultado != lSize, es decir, se continuó con alguna otra ruta de ejecución, entonces sí – es una garantía de pérdida de memoria.

    OriginalEl autor

  5. 0

    Hay dos caminos posibles.

    (1) resultado != lSize – en este caso, exit(0) se llama. Esto mata el proceso y el sistema operativo para limpiar la memoria.

    (2) resultado == lsize – en este caso, el buffer está explícitamente liberado, pero el retorno es llamado justo después que el libre es más que nada por el buen estilo, ya que esto también mata el proceso y el sistema operativo será, de nuevo, la limpieza de la memoria.

    Por lo que en este caso simple, no hay ninguna pérdida de memoria. Pero es probablemente una buena práctica sólo asegúrese de que está liberando la memoria que ha asignado en cualquier aplicación que usted escribe. Llegar a este hábito va a evitar muchos dolores de cabeza para usted en el futuro.

    OriginalEl autor user22810

  6. 0

    Como a la posible pérdida de memoria, otros ya han respondido a esa pregunta. Hace un tiempo, he publicado una variación del código dado que debe manejar todas las posibles condiciones de error correctamente:

    OriginalEl autor Christoph

Dejar respuesta

Please enter your comment!
Please enter your name here