Frage

Ich benutze oft die Website www.cplusplus.com als Referenz, wenn C-Code zu schreiben.

Ich lese das Beispiel auf der Seite zitiert für fread und hatte eine Frage.

Als Beispiel sie schreiben:

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

Es scheint mir, dass, wenn das Ergebnis! = LSize, dann frei (Puffer) erhält nie genannt. Wäre dies ein Speicherleck in diesem Beispiel sein?

Ich habe immer gedacht, die Beispiele auf ihrer Website von sehr hoher Qualität sind. Vielleicht verstehen Ich bin nicht richtig?

War es hilfreich?

Lösung

Es wäre nicht ein Speicherleck in diesem Beispiel , sein, weil das Programm beendet wird (durch den Aufruf exit()) befreit den gesamten Speicher mit ihr verbunden sind.

Allerdings wäre es ein Speicherverlust, wenn Sie dieses Stück Code als ein Unterprogramm verwendet, und so etwas wie return 1; anstelle von exit() genannt.

Andere Tipps

Technisch ja, es ist ein Speicherleck. Aber jeder von einem Prozess zugewiesene Speicher wird automatisch freigegeben, wenn dieser Prozess beendet, so dass in diesem Beispiel die Anrufe zu befreien (und fclose) sind nicht wirklich erforderlich ist.

In einem komplexeren Programm, das wäre wahrscheinlich ein echtes Problem sein. Die fehlend frei würde ein Speicherleck schaffen und die fehlende fclose würde ein Ressource-Leck verursachen.

Das Betriebssystem reinigt durch ein Verfahren, jeden unfreed Speicher, wenn dieser Prozess schließt. Wenigstens moderne Betriebssysteme tun.

Wenn das Programm wurde nicht an dem Punkt Ergebnis Verlassen = LSize, das heißt, es mit einem anderen Ausführungspfad fortgesetzt, dann ja -. Es ist ein garantiertes Speicherleck

Es gibt zwei mögliche Wege.

(1) Ergebnis = LSize - in diesem Fall Ausfahrt (0) aufgerufen. Dies tötet den Prozess und das Betriebssystem den Speicher aufzuräumen.

(2) Ergebnis == LSize - in diesem Fall wird der Puffer explizit freigegeben, aber Rückkehr aufgerufen wird direkt danach so die frei ist meist nur guter Stil, weil dies auch den Prozess tötet und das Betriebssystem wieder sauber auf den Speicher.

So in diesem einfachen Fall gibt es keinen Speicherverlust. Aber es ist wahrscheinlich eine gute Praxis nur sicherstellen, dass Sie befreien beliebige Speicher Sie in jeder Anwendung zugewiesen haben Sie schreiben. Der Einstieg in diese Gewohnheit werden viele Kopfschmerzen für Sie in Zukunft verhindern.

In Bezug auf mögliche Speicherlecks, haben andere die bereits beantwortet diese Frage. Vor einiger Zeit gab ich eine Variation des gegebenen Code, der sollte behandelt alle möglichen Fehlerbedingungen richtig:

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top