Domanda

Ad esempio:

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

Ci sono effetti collaterali negativi nel fare questo?

È stato utile?

Soluzione

Ecco il capitolo e il verso.

  

Se l'argomento [alla funzione free ] non corrisponde a un puntatore precedentemente restituito da calloc , malloc o    realloc o se lo spazio è stato deallocato da una chiamata a free o realloc ,   il comportamento non è definito. ( ISO 9899: 1999 - Linguaggi di programmazione & # 8212; C , sezione 7.20.3.2)

Altri suggerimenti

Uno di niente, corruzione della memoria silenziosa o errore di segmentazione.

Sì, è possibile ottenere un doppio errore gratuito che causa l'arresto anomalo del programma. Ha a che fare con le strutture di dati interne di malloc per tenere traccia della memoria allocata.

Riepilogo risposte:

Sì, possono e probabilmente succederanno cose brutte.

Per evitare ciò, fare:

free(myString);
myString = NULL;

Nota che tutti i riferimenti alla memoria devono essere impostati su NULL se ne sono stati creati altri.

Inoltre, chiamando free () con un NULL non si ottiene alcuna azione. Per maggiori informazioni, consulta: man free

Non così intelligente. Google per doppie vulnerabilità gratuite. Imposta il puntatore su NULL dopo la liberazione per evitare tali bug.

A seconda del sistema su cui lo si esegue, non accadrà nulla, il programma si arresterà in modo anomalo, la memoria verrà danneggiata o qualsiasi altro numero di effetti interessanti.

Imposta sempre un puntatore su NULL dopo averlo liberato. È sicuro tentare di liberare un puntatore null.

Vale la pena scrivere il tuo wrapper gratuito per farlo automaticamente.

Non farlo. Se la memoria che è stata liberata viene riassegnata a qualcos'altro tra le chiamate a free , le cose verranno incasinate.

Cose cattive (TM)

In realtà, penso che sia indefinito, quindi qualsiasi cosa, inclusa la riproduzione di "Guerra Termonucleare Globale", con il mainframe del NORAD

Potrebbe causare l'arresto anomalo del programma, la memoria danneggiata o avere altri effetti negativi più sottili. Dopo aver eliminato la memoria, è consigliabile impostarla su NULL (0). Cercare di liberare un puntatore null non fa nulla ed è garantito per essere sicuro. Lo stesso vale per l'eliminazione in c ++.

In breve: " Undefined Behaviour " ;.

(Ora, cosa può includere e perché è il caso che gli altri hanno già detto. Ho pensato che valesse la pena menzionare qui il termine in quanto è abbastanza comune).

La macro, stranamente, di seguito, è un utile rimpiazzo per eliminare alcune classi di vulnerabilità della sicurezza e aiutare il debug poiché gli accessi a regioni libere () hanno più probabilità di segfault invece di danneggiare in silenzio la memoria.

/ p>

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

Il ciclo do-while serve per aiutare il codice circostante a digerire più facilmente le istruzioni multiple. per esempio. if (done) my_free (x);

Un'altra situazione interessante:

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;
}

//?!? :)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top