Ist free (ptr) wo ptr ist NULL beschädigter Speicher?

Theoretisch kann ich das sagen

free(ptr); free(ptr); 

ist eine Speicherkorruption, da wir den Speicher freigeben, der bereits freigegeben wurde.

Aber was wenn

 free(ptr); ptr=NULL; free(ptr); 

Da sich das Betriebssystem auf undefinierte Art und Weise verhalten wird, kann ich keine tatsächliche theoretische Analyse dafür erhalten, was passiert. Was auch immer ich mache, ist diese Gedächtniskorruption oder nicht?

Ist das Freigeben eines Nullzeigers gültig?

7.20.3.2 Die free function

Zusammenfassung

 #include  void free(void *ptr); 

Beschreibung

Die free function bewirkt, dass der Raum, auf den ptr , freigegeben wird, dh für die weitere Zuweisung verfügbar gemacht wird. Wenn ptr ein Nullzeiger ist, tritt keine Aktion auf.

Siehe ISO-IEC 9899 .

Wenn Sie jedoch verschiedene Codebasen in freier Wildbahn betrachten, werden Sie bemerken, dass Menschen manchmal Folgendes tun:

 if (ptr) free(ptr); 

Dies liegt daran, dass einige C-Laufzeiten (ich erinnere mich sicher daran, dass dies bei PalmOS der Fall war) beim Löschen eines NULL pointerss abstürzen würden.

Aber heutzutage, glaube ich, ist es sicher anzunehmen, dass free(NULL) ein NOP ist, wie es durch den Standard angewiesen ist.

Alle standardkonformen Versionen der C-Bibliothek behandeln free (NULL) als No-Op.

Das heißt, zu einer Zeit gab es einige Versionen von free, die auf frei (NULL) abstürzen würden, weshalb Sie einige defensive Programmiertechniken empfehlen können:

 if (ptr != NULL) free(ptr); 

Wenn ptr NULL ist, wird keine Operation ausgeführt.

sagt die Dokumentation.

Ich erinnere mich daran, auf PalmOS zu arbeiten, wo free(NULL) abgestürzt ist.

 free(ptr); ptr=NULL; free(ptr);/*This is perfectly safe */ 

Sie können einen NULL-pointers sicher löschen. In diesem Fall wird keine Operation ausgeführt. Mit anderen Worten, free () tut nichts an einem NULL-pointers.

Empfohlene Verwendung:

 free(ptr); ptr = NULL; 

Sehen:

 man free The free() function deallocates the memory allocation pointed to by ptr. If ptr is a NULL pointer, no operation is performed. 

Wenn Sie nach free() den pointers auf NULL , können Sie free() erneut aufrufen und es wird keine Operation ausgeführt.

free(NULL) ist in C vollkommen legal, ebenso wie delete (void *)0 und delete[] (void *)0 sind in C ++ zulässig.

Übrigens verursacht das zweimalige Freigeben von Speicher normalerweise eine Art Laufzeiterrors, so dass nichts beschädigt wird.

free (ptr) ist in C gespeichert, wenn ptr NULL ist, was aber die meisten Leute nicht wissen, ist, dass NULL nicht gleich 0 sein muss. Ich habe ein schönes Beispiel aus der alten Schule: Auf dem C64, auf Adresse 0, dort ist ein IO-Port. Wenn Sie ein Programm in C schreiben, das auf diesen Port zugreift, benötigen Sie einen pointers mit dem Wert 0. Die entsprechende c-Bibliothek müsste dann zwischen 0 und NULL unterscheiden.

Mit freundlichen Grüßen

keine Speicherbeschädigung, aber das Verhalten hängt von der Implementierung ab. Standardmäßig sollte es ein gesetzlicher Code sein.

ptr zeigt auf einen Speicherort, sagen wir mal 0x100.

Wenn Sie free (ptr) freigeben, können Sie grundsätzlich zulassen, dass 0x100 vom Speichermanager für andere Aktivitäten oder processe verwendet wird, und in einfachen Worten, es ist die Freigabe von Ressourcen.

Wenn Sie ptr = NULL verwenden, zeigen Sie ptr auf einen neuen Speicherort an (lassen Sie sich keine Gedanken darüber machen, was NULL ist). Auf diese Weise haben Sie die 0x100-Speicherdaten verloren. Dies ist der Speicherleck.

Daher ist es nicht ratsam, ptr = NULL für ein gültiges ptr zu verwenden.

Stattdessen können Sie eine sichere Überprüfung durchführen, indem Sie Folgendes verwenden:

if (ptr! = NULL) {frei (ptr);}

Wenn Sie (ptr) freigeben, wo ptr bereits auf NULL zeigt, führt es keine Operation durch. So, es ist sicher, dies zu tun.