Frage

Zum Beispiel:

char * myString = malloc(sizeof(char)*STRING_BUFFER_SIZE);
free(myString);
free(myString);

Gibt es irgendwelche Nebenwirkungen, dies zu tun?

War es hilfreich?

Lösung

Hier ist das Kapitel und Vers.

  

Wenn das Argument [zur free Funktion] entspricht nicht einen Zeiger früher zurück durch die calloc, malloc oder   realloc Funktion oder wenn der Raum durch einen Aufruf Zuordnung aufgehoben worden free oder realloc,   das Verhalten ist nicht definiert. ( ISO 9899: 1999 - Programmiersprachen - C , Abschnitt 7.20.3.2)

Andere Tipps

Einer von nichts, stiller Speicherbeschädigung oder Zugriffsfehlern.

Ja, Sie können eine doppelte freie Fehlermeldung erhalten, dass Ihr Programm zum Absturz bringt. Es hat mit malloc internen Datenstrukturen zu tun Spur von zugewiesenen Speicher zu halten.

Antwort Zusammenfassung:

Ja, schlechte Dinge kann und wird wahrscheinlich passieren.

Dies tun, um zu verhindern:

free(myString);
myString = NULL;

Beachten Sie, dass alle Verweise auf den Speicher gesetzt werden müssen, um NULL wenn andere erstellt wurden.

Auch in keiner Aktion free() mit NULL Ergebnisse aufrufen. Für weitere Informationen siehe: Mann frei

Nicht so clever. Google für doppelte frei Verwundbarkeiten. Setzen Sie den Mauszeiger auf NULL nach Freigabe solche Fehler zu vermeiden.

Je nachdem, welches System Sie es liefen auf, nichts passiert, wird das Programm abstürzen, wird Speicher beschädigt, oder jede andere Anzahl von interessanten Effekten.

Immer einen Zeiger auf NULL gesetzt, nachdem sie zu befreien. Es ist sicher zu versuchen, einen Null-Zeiger zu befreien.

Es lohnt sich Ihre eigene kostenlose Wrapper schreibe dies automatisch zu tun.

Es (potentiell) macht Dämonen aus der Nase fliegen.

Tu das nicht. Wenn der Speicher, der zwischen den Anrufen auf etwas anderes neu zugewiesen wurde befreit wird free, dann werden die Dinge vermasselt.

Bad Things (TM)

Wirklich, ich denke, es ist nicht definiert, so etwas überhaupt einschließlich „Globale thermonuklearen Krieg“ mit NORAD Mainframe spielt

Es kann Ihr Programm, korrupte Speicher abstürzen oder andere subtilere negative Auswirkungen haben. Nachdem Sie Speicher löschen, ist es eine gute Idee, es auf NULL (0) gesetzt. Der Versuch, einen Null-Zeiger zu befreien tut nichts, und ist garantiert sicher zu sein. Das gleiche gilt für die in C ++ löschen.

Kurz gesagt:. "Undefiniertes Verhalten"

(Nun, was das können sein, warum das der Fall ist haben die anderen schon gesagt. Ich dachte, es war einfach erwähnenswert, den Begriff hier, wie es durchaus üblich ist).

Die zugegebenermaßen merkwürdige Makro ist eine nützliches Drop-in-Ersatz für das Abwischen und ein paar Klassen von Sicherheitslücken heraus als Hilfe Debuggen da Zugriffe 'zu befreien () d Regionen eher stattdessen segfault Speicher leise korrumpieren.

#define my_free(x) do { free(x); x = NULL; } while (0)

Die do-while-Schleife ist umgebenden Code leichter zu verdauen, die mit mehreren Aussagen zu helfen. z.B. if (getan) my_free (x);

Eine weitere interessante Situation:

char * myString = malloc(sizeof(char)*STRING_BUFFER_SIZE);
char * yourString = myString;

if (myString)
{
    free(myString);
    myString = NULL;
}
// Now this one is safe, because we keep to the rule for 
// setting pointers to NULL after deletion ...
if (myString)
{
    free(myString);
    myString = NULL;
}

// But what about this one:
if (yourString)
{
    free(yourString);
    yourString = NULL;
}

//?!? :)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top