Ich habe in Vorlesungen unterrichtet, dass das Rufen von free()
auf einem Zeiger zweimal wirklich, wirklich schlecht ist. Ich weiß, dass es eine gute Übung ist, einen Zeiger auf NULL
zu setzen, gleich nachdem er freigegeben wurde.Zweimal auf einen Zeiger rufen
Allerdings habe ich noch nie eine Erklärung dafür gehört, warum das so ist. Von dem, was ich verstehe, die Art und Weise malloc()
funktioniert, sollte es technisch verfolgen die Zeiger, die es zugewiesen hat und Ihnen zu verwenden. Also warum weiß es nicht, ob ein Zeiger, den es durch free()
erhält, schon freigegeben wurde oder nicht?
Ich würde gerne verstehen, was intern passiert, wenn Sie free()
an einem Speicherort aufrufen, der zuvor bereits freigegeben wurde.
der Zeiger ist nur, wo Sie die direccion der Daten anotate, aber was Sie tatsächlich frei ist die Daten selbst – Netwave
@DanielSanchez Ja, aber da malloc Sie diesen Zeiger wirft, sollte nicht die Speicherfreigabe/Zuteilung konstruieren noch Beachten Sie, dass es die Position freigegeben hat, auf die der Zeiger vorher zeigt? – Joe
Wenn Sie den Zeiger nicht verwenden, nachdem Sie "frei" sind, dann ist es nicht sinnvoll, ihn auf "NULL" zu setzen. Und * wenn * Sie den Zeiger verwenden, nachdem Sie "frei" haben, haben Sie * undefiniertes Verhalten *, egal, ob Sie es auf "NULL" setzen oder nicht. Natürlich, wenn Sie * für "NULL" überprüfen, dann hilft es, aber die Notwendigkeit, einen Zeiger auf "NULL" zu setzen, ist nicht etwas, das Sie absolut tun müssen, tun Sie es von Fall zu Fall abhängig davon, wie Sie verwenden der Zeiger. –