Freigeben eines Nullzeigers

Lesezeit: 4 Minuten

Vijays Benutzeravatar
Vijay

Was passiert im Speicher, wenn wir versuchen, einen Zeiger freizugeben, der auf NULL zeigt? Gilt das jemals?

Warum werden keine Warn-/Fehlermeldungen angezeigt?

  • nichts; … Trotzdem ist das Verhalten, einen Zeiger freizugeben, der nicht null ist, alles, was nicht früher mallociert wurde, undefiniert und normalerweise katastrophal.

    – SF.

    1. März 2010 um 11:48 Uhr

  • Zeiger “zeigen nicht auf NULL”. Zeiger auch nicht sind oder sind nicht selbst null. “Zeiger, der auf NULL zeigt” ist eine unsinnige Aussage.

    – AnT steht zu Russland

    2. März 2010 um 2:18 Uhr

  • Wenn ein Zeiger eine Adresse einer Variablen speichert, ist es üblich, dass ein Programmierer sagt, dass der Zeiger auf diese Variable zeigt. Es ist also keine unsinnige Aussage. Vielleicht irre ich mich. Aber es scheint mir nicht so eine unsinnige aussage.

    – Vijay

    2. März 2010 um 4:21 Uhr


  • Wenn ein Zeiger null ist, “speichert er nicht die Adresse von NULL”. NULL hat keine Adresse. Wenn ein Zeiger null ist, zeigt er einfach nirgendwo hin.

    – AnT steht zu Russland

    2. März 2010 um 5:27 Uhr

  • Diese Frage ist ein Duplikat von stackoverflow.com/questions/1912325/…

    – Vog

    23. Dezember 2010 um 14:05 Uhr

Aus C99 Abschnitt 7.20.3.2 : Die frei Funktion

Zusammenfassung

 1 #include <stdlib.h>
   void free(void *ptr);

Beschreibung

2 Die Funktion free bewirkt, dass der Speicherplatz, auf den ptr zeigt, freigegeben wird, d. h. für eine weitere Zuweisung verfügbar gemacht wird. Wenn ptr ein Nullzeiger ist, findet keine Aktion statt.

Aus http://linux.die.net/man/3/malloc:

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

  • Für diejenigen, die befürchten, dass es sich um eine Linux-Erweiterung handelt, ist dieses Verhalten vom C90-Standard vorgeschrieben.

    – Ein Programmierer

    1. März 2010 um 8:56 Uhr

  • Es ist interessant festzustellen, dass die Leute, die diese Linux-Manpage geschrieben haben, den Unterschied zwischen entweder nicht verstanden oder sich nicht darum gekümmert haben NULL und “Nullzeigerwert”. Die meisten seriösen und / oder formellen Dokumente sind normalerweise ziemlich pedantisch (siehe andere Antworten).

    – AnT steht zu Russland

    2. März 2010 um 6:47 Uhr


Es war einmal vor sehr langer Zeit, dass es Implementierungen von ‘free()’ gab, die abstürzten, wenn sie einen Nullzeiger auf free erhielten. Dies gilt nur für Implementierungen, die vor dem C89 (C90)-Standard liegen und seitdem nicht geändert wurden, um das Problem zu lösen.

Meiner Erfahrung nach gibt es im Wesentlichen keine dieser Implementierungen mehr (und sollte es auch nicht geben), sodass es jetzt sicher ist, Nullzeiger freizugeben.

Wenn Sie irgendwelche Anforderungen haben, um auf extrem seltsame und alte Systeme zu portieren, dann sollten Sie vielleicht trotzdem vorsichtig sein. Auf der anderen Seite, wenn Sie solche Systeme hätten, um die Sie sich Sorgen machen müssten, wüssten Sie wahrscheinlich von dem Problem (und einer ganzen Reihe anderer Probleme) – oder es gäbe einige gemeinsame Kenntnisse über den Code, die dies anzeigen.

Benutzeravatar von edgar.holleis
edgar.holleis

Ich würde gehen für:

#ifdef MY_DOUBTS_HAUNT_ME_IN_MY_DREAMS
    #define safe_free(x) do { if ((x)) free((x)); } while(0)
#elseif /* feeling gutsy */
    #define safe_free(x) free((x))
#endif

;-||

Das Freigeben des Nullzeigers hat keine Auswirkung auf die Ausführung.

Benutzeravatar von Daniel Daranas
Daniel Daranas

Was passiert im Speicher, wenn wir versuchen, einen Zeiger freizugeben, der auf NULL zeigt? ist das jemals gültig?

Nichts.

Warum werden keine Warn-/Fehlermeldungen angezeigt?

Erstens ist das Verhalten per Definition gültig, sodass kein Fehler oder keine Warnung ausgegeben werden muss.

Zweitens zeigt ein Zeiger zur Laufzeit auf NULL. Wie soll eine Warn- oder Fehlermeldung angezeigt werden, wenn überhaupt? Stellen Sie sich vor, Sie spielen ein Spiel namens Kill the Zombie und während zwei dieser Wesen Sie angreifen, erscheint eine Popup-Fehlermeldung mit der Aufschrift: „Warnung, NULL-Zeiger befreit.“

Es könnte sicher sein (das wusste ich nicht, aber die anderen Antworten scheinen darauf hinzudeuten), aber ich werde nicht in die Gewohnheit verfallen, mich nicht darum zu kümmern, ob der Zeiger bereits null ist. Die Zuordnung p = NULL; nach jedem freien bald folgt als logische Folge. Dies ist in Multithread-Anwendungen gefährlich, da nach dieser Zuweisung p könnte von einem anderen Thread verwendet werden und vom aktuellen Thread wieder freigegeben werden, während es von den anderen Threads erwartet wird, dass es aktiv ist.

Jeder gesperrte Speicher sollte einmal freigegeben werden. Zeitraum.

  • Der Zugriff auf gemeinsam genutzte Daten in Multithread-Anwendungen sollte geschützt werden, wodurch das von Ihnen beschriebene Speicherleck verhindert wird.

    – aussen

    1. März 2010 um 9:07 Uhr

  • @outis Das Problem ist kein Speicherleck, sondern das Löschen von Daten, von denen die anderen Threads erwarten, dass sie am Leben sind (wird wahrscheinlich zu einem Segmentierungsfehler führen). Ein geschützter Zugang ist in diesem Fall nicht ausreichend.

    – amit kumar

    1. März 2010 um 10:50 Uhr


  • Was Sie über Threading erwähnen, scheint richtig zu sein, gilt aber meines Wissens nicht für diese Frage, und Sie versuchen nicht, diese Frage zu beantworten.

    Roger Pate

    3. März 2010 um 5:43 Uhr

  • @Roger Es “trifft definitiv auf die Frage zu”, da es um eine schlechte Angewohnheit geht. Es lohnt sich nicht, die gleichen Punkte zu machen, die die anderen gemacht haben, und andere haben die Frage bereits “richtig” beantwortet.

    – amit kumar

    3. März 2010 um 10:31 Uhr

1388110cookie-checkFreigeben eines Nullzeigers

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

Privacy policy