Was passiert, wenn Sie versuchen, free() bereits freigegebenen Speicher in c freizugeben?

Lesezeit: 3 Minuten

Zum Beispiel:

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

Gibt es irgendwelche nachteiligen Nebenwirkungen, wenn Sie dies tun?

Hier ist das Kapitel und der Vers.

Wenn das Argument [to the free function] stimmt nicht mit einem Zeiger überein, der zuvor von zurückgegeben wurde calloc, mallocoder
realloc -Funktion oder wenn der Speicherplatz durch einen Aufruf von freigegeben wurde free oder realloc, ist das Verhalten undefiniert. (ISO 9899:1999 – Programmiersprachen – CAbschnitt 7.20.3.2)

  • FYI: Wenn C oder C++ “undefiniert” sagen, meinen sie normalerweise “Absturz” oder “Speicherbeschädigung” oder etwas ähnlich Schreckliches. In acht nehmen.

    – Orion Edwards

    2. März 2009 um 2:43 Uhr

  • Nein, sie bedeuten wirklich “undefiniert”. Dazu gehören Abstürze und Speicherbeschädigungen.

    – Chris Conway

    2. März 2009 um 17:23 Uhr

  • @OrionEdwards Der Compiler könnte beispielsweise entscheiden, NetHack zu starten.

    – Remmy

    19. April 2014 um 12:03 Uhr

Einer von nichts, stille Speicherbeschädigung oder Segmentierungsfehler.

  • Segfaults treten auf, wenn Sie auf Speicher zugreifen, der außerhalb der Grenzen liegt.

    Benutzer376845

    19. Mai 2016 um 6:43 Uhr

Ja, Sie können einen Double-Free-Fehler erhalten, der Ihr Programm zum Absturz bringt. Es hat mit den internen Datenstrukturen von malloc zu tun, um den zugewiesenen Speicher zu verfolgen.

Benutzeravatar von lillq
lillq

Zusammenfassung der Antwort:

Ja, schlimme Dinge können und werden wahrscheinlich passieren.

Um dies zu verhindern, tun Sie Folgendes:

free(myString);
myString = NULL;

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

Auch anrufen free() mit einer NULL führt zu keiner Aktion. Weitere Informationen finden Sie unter: Mann frei

Nicht so schlau. Google für Double-Free-Schwachstellen. Setzen Sie Ihren Zeiger auf NULL nach dem Freigeben, um solche Fehler zu vermeiden.

  • Leider können Sie keinen kostenlosen Wrapper schreiben, der dies für Sie erledigt, der Zeiger wird als Wert und nicht als Referenz übergeben. dh Free(void **p) {free(*p); *p = NULL;} Damit lässt sich Code nicht so einfach umrüsten.

    – Jblener

    25. September 2008 um 19:40 Uhr

  • ajbl, verwenden Sie ein Makro. #define freep(x) (free(x); x = 0;)

    – Derek Park

    25. September 2008 um 19:46 Uhr

  • Schlechte Idee, da sie nicht auf konstante Werte anwendbar ist. Wo es möglich ist, verwenden Sie konstante Werte, nicht wahr?

    – Steve Jessop

    30. November 2008 um 14:47 Uhr

  • @Steve: Ich weiß, das ist alt, aber haben wir nicht anderswo darüber gesprochen, dass ein const-qualifizierter Zeiger auf übergeben wird free ist nicht gültig (sowohl konzeptionell als auch formal, es sei denn, Sie werfen den Qualifizierer weg)? 🙂

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    6. September 2011 um 4:05 Uhr

  • @R..: Ich rede von char *const ptr = malloc(STRING_BUFFER_SIZE); ... ; free(ptr);. Ich halte das weder formal noch konzeptionell für ungültig. Danach, ptr = 0; steht nicht auf den Karten. Wenn Sie also ein Makro definieren freep wie Derek sagt, dann kannst du es nicht verwenden ptr.

    – Steve Jessop

    6. September 2011 um 7:22 Uhr

Benutzeravatar von Jens
Jens

Es macht (möglicherweise). Dämonen fliegen aus deiner Nase.

  • Leider können Sie keinen kostenlosen Wrapper schreiben, der dies für Sie erledigt, der Zeiger wird als Wert und nicht als Referenz übergeben. dh Free(void **p) {free(*p); *p = NULL;} Damit lässt sich Code nicht so einfach umrüsten.

    – Jblener

    25. September 2008 um 19:40 Uhr

  • ajbl, verwenden Sie ein Makro. #define freep(x) (free(x); x = 0;)

    – Derek Park

    25. September 2008 um 19:46 Uhr

  • Schlechte Idee, da sie nicht auf konstante Werte anwendbar ist. Wo es möglich ist, verwenden Sie konstante Werte, nicht wahr?

    – Steve Jessop

    30. November 2008 um 14:47 Uhr

  • @Steve: Ich weiß, das ist alt, aber haben wir nicht anderswo darüber gesprochen, dass ein const-qualifizierter Zeiger auf übergeben wird free ist nicht gültig (sowohl konzeptionell als auch formal, es sei denn, Sie werfen den Qualifizierer weg)? 🙂

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    6. September 2011 um 4:05 Uhr

  • @R..: Ich rede von char *const ptr = malloc(STRING_BUFFER_SIZE); ... ; free(ptr);. Ich halte das weder formal noch konzeptionell für ungültig. Danach, ptr = 0; steht nicht auf den Karten. Wenn Sie also ein Makro definieren freep wie Derek sagt, dann kannst du es nicht verwenden ptr.

    – Steve Jessop

    6. September 2011 um 7:22 Uhr

Benutzeravatar von John Millikin
John Millikin

Je nachdem, auf welchem ​​System Sie es ausführen, passiert nichts, das Programm stürzt ab, der Speicher wird beschädigt oder es gibt eine Reihe anderer interessanter Effekte.

1390470cookie-checkWas passiert, wenn Sie versuchen, free() bereits freigegebenen Speicher in c freizugeben?

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

Privacy policy