Was ist der Unterschied zwischen dem Freigeben des Zeigers und dem Zuweisen zu NULL?

Lesezeit: 4 Minuten

Benutzer-Avatar
Sanjeev Kumar Dangi

Kann mir jemand den Unterschied sagen zwischen:

int *p;
p=(int*)malloc(10*sizeof(int));
free(p);

oder

int *p;
p=(int*)malloc(10*sizeof(int));
p=NULL;

  • C ist nicht Java. 🙂

    – vladr

    12. MĂ€rz 2010 um 6:03 Uhr

free wird den Speicher freigeben, dass p zeigt auf – einfach zuordnen NULL wird nicht (und somit haben Sie ein Speicherleck).

Es ist erwÀhnenswert, dass es sich bewÀhrt hat, Ihren Zeiger zuzuweisen NULL NACH dem Anruf an freeda dies verhindert, dass Sie versehentlich versuchen, auf den freigegebenen Speicher zuzugreifen (was immer noch möglich ist, aber absolut nicht getan werden sollte).

  • In C ist ein Zeiger buchstĂ€blich nur ein Wert, wie ein Int. Wenn Sie es mit ‘=’ auf einen Wert setzen, passiert buchstĂ€blich nur, dass es auf diesen Wert gesetzt wird, es gibt nichts anderes, was hinter den Kulissen passiert.

    – matt

    12. MĂ€rz 2010 um 7:21 Uhr

Es gibt keine Garbage Collection in C. Wenn Sie also einen Teil des Speichers nicht explizit freigeben, wird er nie freigegeben, selbst wenn es keine Verweise darauf gibt. Vielleicht haben Sie einen Hintergrund in Garbage Collection-Sprachen, daher kann es schwierig sein, Ihre Denkweise zu Ă€ndern, aber es ist immer wichtig, daran zu denken, alle Ressourcen in Low-Level-Sprachen wie C “manuell” freizugeben.

Hoffe das hilft Prost

Benutzer-Avatar
mjv

p ist ein Zeiger (auf einen Block, der dynamisch im Speicher zugewiesen wird [“on the Heap”])
Das bedeutet, dass p eine Variable ist, die die enthĂ€lt die Anschrift im Speicher eines bestimmten Blocks (oder einer bestimmten GrĂ¶ĂŸe, im Beispiel ein Block, der groß genug ist, um 10 Ganzzahlen aufzunehmen).

free(p); weist die Speicherverwaltungslogik (der C-Laufzeit) an, dass der zuvor von dem Block belegte Speicher, auf den p zeigt, wiederverwendet werden kann.

p = NULL; setzt den Wert von p auf NULL (die zuvor enthaltene Adresse geht verloren), aber der Block im Speicher, auf den es auch zeigt, wird immer noch als verwendet betrachtet.

Es kann zu Verwirrung kommen, da in Sprachen wie Java, C#, Python usw. die bloße Zuweisung der Variablen zu NULL (oder zu einer anderen Adresse) automatisch den zugrunde liegenden Speicher freigibt (vorausgesetzt, es gibt keine anderen Verweise auf diese Adresse in anderen Live-Variablen).

Dies ist in C oder C++ nicht der Fall, was zu Fehlern wie den folgenden fĂŒhrt:

  free(p);
  // possibly some some code etc.
  // later:
  p[6] = 'a';  // <<---  Ouch we're modifying whatever new variable is there !!!

oder

  // didn't call free(p)
  p = NULL;
  // now the memory allocated for p is held in memory even though it
  // is not going to be used (assuming no copies of p or of pointers to part
  // of that block were made.

Der letztere Fall ist nur eine Verschwendung von Ressourcen, der erstere kann zu schwer zu findenden Fehlern fĂŒhren.

Deshalb ein typisches C-Idiom ist:

   free(p);
   p = NULL;

Wenn Sie nicht kostenlos anrufen und NULL direkt zuweisen, fĂŒhrt dies zu einem Speicherleck, wie von anderen erklĂ€rt. Darauf können Sie sich beziehen VerknĂŒpfung um klare Details zu Speicherlecks und anderen speicherbezogenen Problemen zu erhalten.

Benutzer-Avatar
Sanjay

Der bessere Weg ist, zuerst den Speicher freizugeben und ihn dann auf NULL zu setzen:

free(p);
p = NULL;

Benutzer-Avatar
Yktula

Das Freigeben des zugewiesenen Speichers hebt die Zuweisung auf und ermöglicht, dass dieser Speicher an anderer Stelle verwendet wird, wÀhrend der Zeiger darauf, wo der Speicher zugewiesen wurde, erhalten bleibt.

Das Setzen eines Zeigers auf den zugewiesenen Speicher auf NULL hebt die Zuweisung nicht auf.

Wenn Sie eine Implementierung verwenden, die einen heapbasierten Malloc verwendet, debuggen Sie etwas, das Speicher zuweist, verwendet und freigibt, und machen Sie dasselbe mit etwas, das den Zeiger zu dem Speicher zuweist, verwendet und auf NULL setzt.

Die Speicherverwaltung ist implementierungsabhÀngig (vgl http://en.wikipedia.org/wiki/Malloc#Implementations).

1.


int *p;
p= (int * ) malloc(10*sizeof(int));
free(p);

der Speicher wird wieder auf den Heap freigegeben. aber der Zeiger zeigt immer noch auf die freigegebene Speicherstelle. Wenn es also weiter verwendet wird, wĂŒrde es zu a fĂŒhren SpeicherbeschĂ€digung.

Daher ist es richtig, den Zeiger explizit auf NULL zurĂŒckzusetzen, um eine weitere Verwendung dieses Zeigers zu vermeiden.

Es ist nicht ratsam, den RĂŒckgabezeiger in C umzuwandeln

2.


int *p;
p=(int * )malloc(10*sizeof(int));
p=NULL;

Daraus ergĂ€be sich ein Speicherleck : da der allokierte Speicher hier nicht freigegeben wird. Sie setzen nur den Zeiger auf NULL zurĂŒck.

1353880cookie-checkWas ist der Unterschied zwischen dem Freigeben des Zeigers und dem Zuweisen zu NULL?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy