Die Funktion eine Instanz von struct Foo unten gegeben wird für die Freigabe:Ist dies eine gute Möglichkeit, Speicher in C freizugeben?
void DestroyFoo(Foo* foo)
{
if (foo) free(foo);
}
Ein Kollege von mir vorgeschlagen, die folgenden statt:
void DestroyFoo(Foo** foo)
{
if (!(*foo)) return;
Foo *tmpFoo = *foo;
*foo = NULL; // prevents future concurrency problems
memset(tmpFoo, 0, sizeof(Foo)); // problems show up immediately if referred to free memory
free(tmpFoo);
}
Ich sehe, dass der Zeiger auf NULL Einstellung nach Freigabe ist besser, aber ich bin mir nicht sicher über die folgenden:
- Müssen wir wirklich den Zeiger auf a zuweisen temporäre? Hilft es in Bezug auf Nebenläufigkeit und geteilten Speicher?
- Ist es wirklich eine gute Idee, den ganzen Block auf 0 zu setzen, um das Programm zum Absturz zu bringen oder zumindest Ergebnisse mit signifikanter Diskrepanz auszugeben?
Vielen Dank im Voraus!
Es hängt alles von Use-Cases und was Sie versuchen zu erreichen. Beachten Sie auch, dass Sie 'free' mit einem Null-Zeiger aufrufen können, es tut dann einfach nichts. –
Dies ist nicht die richtige Frage für Stackoverflow: Die Antworten sind nicht eindeutig. Es gibt Vorteile, die Dinge im zweiten Block des Codes zu tun, aber es gibt auch Nachteile. Ob der Nutzen die Kosten überwiegt, ist nur eine Frage der Meinung. –
Der erste Fall ist falsch - er muss 'if (foo) free (foo)' sein. Andernfalls wird der Speicher bei 'if (! Foo) 'niemals freigegeben. – i486