Frage Ist es immer eine gute Übung, nach dem Freigeben von Zeigern auf NULL zu setzen? [Duplikat]


Mögliche Duplikate:
Variablen nach freiem Zugriff auf NULL setzen ... 

Ich lerne über gute C-Programmierpraktiken und mein Freund sagte mir, dass ich die Zeiger immer auf NULL setzen sollte, nachdem ich sie frei habe () oder indem ich eine bestimmte Freigabefunktion anrufe.

Beispielsweise:

char* ptr = malloc(100);
...
free(ptr);
ptr = NULL;

oder

struct graph* graph = create_graph();
...
destroy_graph(graph);
graph = NULL;

Warum ist das eine gute Übung?

Update: Nach dem Lesen der Antworten scheint es eine schreckliche Übung für mich! Ich verstecke mögliche Double-Free () Fehler. Wie kann dies möglicherweise eine gute Praxis sein? Ich bin schockiert.

Danke, Boda Cydo.


8
2017-07-29 18:23


Ursprung


Antworten:


Schlechte Praxisabstimmung von mir. Wenn du machen Möchten Sie einen Wert zuweisen, setzen Sie ihn auf (void *) 0xdeadbeef. Überprüfen Sie jedoch, was Ihre CRT zuerst tun kann. Ein anständiger Debug-Allokator wird den freigegebenen Speicher auf ein Muster setzen, das wahrscheinlich eine Bombe verursacht, wenn der Zeiger nach der Freigabe verwendet wird. Obwohl es nicht garantiert ist. Aber dann nicht Ändern des Zeigerwerts ist die bessere (und schnellere) Lösung.


2
2017-07-29 18:49



Obwohl es nicht schaden kann, hilft es nicht immer. Das Problem ist, dass es mehrere Kopien des Zeigers gibt und dass Sie wahrscheinlich nur einen einzelnen NULL-Wert festlegen. Das klassische Beispiel, wo es überhaupt nicht hilft, ist:

void free_graph(graph *g)
{
    ...
    free(g);
    g = NULL;  // not useful in this context
}

Das Problem hier ist, dass Sie nur den Zeiger setzen, der lokal ist free_graph auf NULL und der Zeiger wird vom Aufrufer von gehalten free_graph wird immer noch seinen ursprünglichen Wert haben.


13
2017-07-29 18:32



Dies wird von einigen als eine gute Vorgehensweise angesehen, da es verhindert, dass Sie versehentlich auf den Speicher zugreifen, nachdem dieser frei ist ().


6
2017-07-29 18:30



Ich denke ja ...

Wenn Sie einen Teil von menory fertiggestellt haben, sollten wir free (). Dies ermöglicht es, den freigesetzten Speicher für andere Zwecke zu verwenden ... wie weitere malloc () - Aufrufe.

Free nimmt einen Zeiger auf den Speicher als Argument und gibt den Speicher frei, auf den sich der Zeiger bezieht ...

Hoffe das hilft ... :)


-5
2017-07-29 18:28