Ist es empfehlenswert, einen NULL-Zeiger in C freizugeben? [duplicate]

Lesezeit: 4 Minuten

Benutzeravatar von rid
loswerden

Mögliches Duplikat:

Beschädigt free(ptr), wobei ptr NULL ist, den Speicher?

Ich schreibe eine C-Funktion, die einen Zeiger freigibt, wenn es war malloc()ed. Der Zeiger kann entweder NULL sein (falls ein Fehler aufgetreten ist und der Code keine Möglichkeit hatte, etwas zuzuweisen) oder mit zugewiesen werden malloc(). Ist es sicher zu verwenden free(ptr); Anstatt von if (ptr != NULL) free(ptr);?

gcc beschwert sich überhaupt nicht, auch nicht mit -Wall -Wextra -ansi -pedanticaber ist es gute Praxis?

  • siehe auch: auf null prüfen, bevor man kostenlos anruft

    – Matte

    21. Mai 2011 um 20:25 Uhr

  • Wieder öffnen. Die Frage war, “… ist es eine gute Praxis”; und nicht :…ist es legal”. Es sind zwei verschiedene Fragen. Ich bin daran interessiert, die Begründung für die Freigabe eines NULL-Zeigers zu kennen, da nichts freigegeben werden kann. In meinen Augen macht es keinen Sinn und es ist ein Programmfehler.

    – jww

    22. Dezember 2017 um 14:22 Uhr


Benutzeravatar von orlp
Orlp

Zitieren des C-Standards, 7.20.3.2/2 aus ISO-IEC 9899:

void free(void *ptr);

Wenn ptr ein Nullzeiger ist, findet keine Aktion statt.

Suchen Sie nicht nach NULLes fügt nur mehr Dummy-Code zum Lesen hinzu und ist daher eine schlechte Praxis.


Sie müssen jedoch stets prüfen Auf NULL Hinweise bei der Verwendung malloc & co. In diesem Fall NULL bedeutet, dass etwas schief gelaufen ist, höchstwahrscheinlich, dass kein Speicher verfügbar war.

  • Ich bin. Ich habe eine Struktur, die Zeiger enthält. Ich versuche, jeden von ihnen zuzuordnen. Wenn eine Zuweisung zum ersten Mal fehlschlägt (der von zurückgegebene Zeiger malloc() NULL ist), rufe ich die Deallocation-Funktion auf, die alle durchgeht und die zugewiesenen freigibt. Dann signalisiere ich den Fehler. Gibt es einen besseren Weg, dies zu tun?

    – loswerden

    22. Mai 2011 um 0:12 Uhr


  • @rdineiu, vorausgesetzt, Sie initialisieren die Zeiger vor dem auf null malloc anruft (damit du nie free ein nicht initialisierter Zeiger), das ist genau der richtige Weg, das zu tun.

    – David X

    22. Mai 2011 um 7:33 Uhr

  • Einige Antworten zu diesem StackOverflow-Link: stackoverflow.com/questions/1938735/… erwähnen, dass bestimmte C-Bibliotheken diesen Standard ignorieren und trotz dessen, was der C-Standard sagt, Fehler ausgeben. Anschauen lohnt sich evtl.

    – Abraham Philipp

    14. Januar 2015 um 17:56 Uhr

  • “Malloc & Co.” du meinst calloc()

    – Jasonleonhard

    20. Februar 2021 um 2:16 Uhr

Benutzeravatar von jamesdlin
jamesdlin

Es ist eine gute Übung, nicht Mühe, nachzusehen NULL vor dem Anruf free. Das Überprüfen fügt Ihrem Code nur unnötige Unordnung hinzu, und free(NULL) ist garantiert sicher. Aus Abschnitt 7.20.3.2/2 des C99-Standards:

Das free Funktion verursacht das Leerzeichen, auf das von gezeigt wird ptr freigegeben werden, d. h. für eine weitere Zuweisung verfügbar gemacht werden. Wenn ptr ein Nullzeiger ist, findet keine Aktion statt.

Wie in den Kommentaren erwähnt, fragen sich manche Leute manchmal, ob sie nachsehen NULL ist effizienter als ein möglicherweise unnötiger Funktionsaufruf. Dies jedoch:

  • Ist eine verfrühte Mikrooptimierung.
  • Sollte egal sein. Überprüfung auf NULL zuerst könnte sogar a sein Pessimierung. Zum Beispiel, wenn Ihre Pointer in 99 % der Fälle dies nicht sind NULLdann wäre da eine überflüssige NULL überprüfen Sie 99 % der Zeit, um einen zusätzlichen Funktionsaufruf in 1 % der Zeit zu vermeiden.

  • Was ist, wenn der Anruf an free Overhead hat. Wäre es nicht effizienter, den Anruf zu vermeiden?

    – jww

    22. Dezember 2017 um 14:23 Uhr

  • @jww Es könnte sein, aber Sie müssen sich fragen, ob sich der Kompromiss lohnt. Das gemeinsames Fall ist, dass die Dinge nicht fehlschlagen und dass Sie wahrscheinlich mit zugewiesenem Speicher anstelle von Nullzeigern enden. Wenn Sie überall Nullzeigerprüfungen hinzufügen, bedeutet dies, dass Sie jetzt die Leistung Ihrer häufigen Fälle negativ beeinflusst (und Ihrem Code Unordnung hinzugefügt haben), nur um einen zusätzlichen Funktionsaufruf in einem wahrscheinlich atypischen Fehlerfall zu vermeiden.

    – jamesdlin

    23. Dezember 2017 um 1:28 Uhr

  • @jww Der Overhead ist logischerweise nicht mehr als `if(ptr==NULL) return;’ Alles, was Sie also erreichen können, wenn Sie sich selbst überprüfen, ist, den Aufwand zu verdoppeln!

    – Hartnäckig

    14. Januar 2018 um 12:15 Uhr

  • @Persixty Nicht genau, da ein Funktionsaufruf selbst Overhead verursacht.

    – jamesdlin

    6. August 2019 um 15:25 Uhr

  • @jamesdin Ein fairer Punkt. Ein intelligenter Compiler könnte die Prüfung einbetten und nur dann aufrufen, wenn free() wurde benötigt. Aber ich kenne keine wirklichen Beispiele. Also mit einem realistischen Faktor, der einen impotent anruft free() ist das 6-fache des Checks, den Sie gewinnen, es sei denn, mehr als 5/6 der Zeiger sind nicht NULL. Natürlich ist der Zeiger in vielen Anwendungen selten nicht NULL. In der Praxis hatten Sie also im Dezember 2017 Recht. Es gibt einen Kompromiss.

    – Hartnäckig

    12. August 2019 um 11:51 Uhr


Benutzeravatar von Hello71
Hallo71

Sehen http://linux.die.net/man/3/free welche Staaten:

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

Meiner Meinung nach nein, zumindest nicht in Ihrem Fall.

Wenn Sie keinen Speicher zuweisen konnten, sollten Sie dies vor dem Aufruf von free überprüft haben.

1420950cookie-checkIst es empfehlenswert, einen NULL-Zeiger in C freizugeben? [duplicate]

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

Privacy policy