Deallocate Memory

0

Speicher freigeben

Wenn Sie einen Speicherblock nicht mehr benötigen, sollten Sie ihn freigeben. Die Freigabe wird auch als „Freigeben“ des Speichers bezeichnet.

Der dynamische Speicher bleibt reserviert, bis er freigegeben wird oder das Programm beendet wird.

Sobald der Speicher freigegeben ist, kann er von anderen Programmen verwendet oder sogar einem anderen Teil Ihres Programms zugewiesen werden.

Freier Speicher

Um Speicher freizugeben, verwenden Sie die Funktion free():

free(pointer);

Der Zeigerparameter ist ein Zeiger auf die Adresse des freizugebenden Speichers:

int *ptr;
ptr = malloc(sizeof(*ptr));

free(ptr);
ptr = NULL;

Es gilt als bewährte Vorgehensweise, nach der Speicherfreigabe einen Zeiger auf NULL zu setzen, damit Sie ihn nicht versehentlich weiter verwenden können.

Wenn Sie den Speicher nach der Freigabe weiterhin verwenden, können Sie Daten aus anderen Programmen oder sogar einen anderen Teil Ihres eigenen Programms beschädigen.

Beispiel

Ein funktionierendes Beispiel inklusive Fehlerprüfung und -behebung:

int *ptr;
ptr = malloc(sizeof(*ptr)); // Allocate memory for one integer

// If memory cannot be allocated, print a message and end the main() function
if (ptr == NULL) {
  printf("Unable to allocate memory");
  return 1;
}

// Set the value of the integer
*ptr = 20;

// Print the integer value
printf("Integer value: %d\n", *ptr);

// Free allocated memory
free(ptr);

// Set the pointer to NULL to prevent it from being accidentally used
ptr = NULL;

Speicherlecks

Ein Speicherverlust tritt auf, wenn dynamischer Speicher zugewiesen, aber nie freigegeben wird.

Wenn in einer Schleife oder einer häufig aufgerufenen Funktion ein Speicherverlust auftritt, kann dieser zu viel Speicher beanspruchen und den Computer verlangsamen.

Es besteht die Gefahr eines Speicherverlusts, wenn ein Zeiger auf dynamischen Speicher verloren geht, bevor der Speicher freigegeben werden kann. Dies kann unbeabsichtigt passieren. Daher ist es wichtig, vorsichtig zu sein und Zeiger auf dynamischen Speicher im Auge zu behalten.

Hier sind einige Beispiele, wie ein Zeiger auf dynamischen Speicher verloren gehen kann.

Beispiel 1

Der Zeiger wird überschrieben:

int x = 5;
int *ptr;
ptr = calloc(2, sizeof(*ptr));
ptr = &x;

In diesem Beispiel kann auf den von calloc() zugewiesenen Speicher nicht mehr zugegriffen werden, nachdem der Zeiger so geändert wurde, dass er auf x zeigt.

Beispiel 2

Der Zeiger existiert nur innerhalb einer Funktion:

void myFunction() {
  int *ptr;
  ptr = malloc(sizeof(*ptr));
}

int main() {
  myFunction();
  printf("The function has ended");
  return 0;
}

In diesem Beispiel kann auf den von calloc() zugewiesenen Speicher nicht mehr zugegriffen werden, nachdem der Zeiger so geändert wurde, dass er auf x zeigt.

In diesem Beispiel bleibt der innerhalb der Funktion zugewiesene Speicher nach Beendigung der Funktion zugewiesen, kann aber nicht mehr darauf zugegriffen werden. Eine Möglichkeit, dieses Problem zu vermeiden, besteht darin, den Speicher vor Beendigung der Funktion freizugeben.

Beispiel 3

Der Zeiger geht verloren, wenn die Neuzuweisung fehlschlägt:

int* ptr;
ptr = malloc(sizeof(*ptr));
ptr = realloc(ptr, 2*sizeof(*ptr));

Wenn realloc() den Speicher nicht neu zuweisen kann, wird ein Zeiger auf NULL zurückgegeben und der ursprüngliche Speicher bleibt reserviert.

In diesem Beispiel bleibt der innerhalb der Funktion zugewiesene Speicher nach Beendigung der Funktion zugewiesen, kann aber nicht mehr darauf zugegriffen werden. Eine Möglichkeit, dieses Problem zu vermeiden, besteht darin, den Speicher vor Beendigung der Funktion freizugeben.

Wenn in diesem Beispiel realloc() fehlschlägt, wird der NULL Zeiger der Variablen ptr zugewiesen, wodurch die ursprüngliche Speicheradresse überschrieben wird, sodass nicht mehr darauf zugegriffen werden kann.

Zusammenfassung

Zusammenfassend lässt sich sagen, dass Sie bei der Speicherverwaltung in C die folgenden Best Practices verwenden sollten:

  1. Denken Sie daran, nach Fehlern (NULL Rückgabewerte) zu suchen, um herauszufinden, ob die Speicherzuweisung erfolgreich war oder nicht
  2. Verhindern Sie Speicherlecks – denken Sie immer daran, nicht mehr verwendeten Speicher freizugeben. Andernfalls kann die Leistung des Programms beeinträchtigt werden oder, noch schlimmer, es kann abstürzen, wenn der Speicher voll ist.
  3. Setzen Sie den Zeiger nach der Speicherfreigabe auf NULL, damit Sie ihn nicht versehentlich weiter verwenden können
Nach oben scrollen