2011-11-04 16 views
6

Eventuali duplicati:
Is there any reason to check for a NULL pointer before deleting?Eliminazione di un puntatore nullo

Vedo spesso il seguente nel codice:

if(pointer) 
    delete pointer; 

Per la mia comprensione è sicuro di eliminare un nulla puntatore, quindi qual è il punto di questo controllo?

+2

..... È sicuro? – slartibartfast

+3

Importante punto da ricordare è impostato su NULL una volta eliminato. – vrrathod

+1

Per quanto ho capito, la tua comprensione è corretta ma non tutte le persone la condividono. Ma vediamo cosa dicono i membri del linguaggio. – delnan

risposta

9

delete controllerà se il puntatore è NULL per te, quindi hai ragione che il controllo non è necessario.

Si potrebbe anche vedere che alcune persone impostare il puntatore a NULL dopo viene eliminato in modo da non fare niente di stupido come cercare di utilizzare la memoria che non è più il vostro o si smette di eliminare il puntatore due volte, che causerà un errore

+0

Al tuo commento "in modo che tu non faccia niente di stupido come prova e usi la memoria che non è più tua", anche il dereferenziamento di un puntatore nullo è un UB. È utile nel caso in cui il puntatore viene cancellato di nuovo (doppia cancellazione che hai già menzionato) –

1

Mentre è sicuro ora, non è sempre stato così :-) è probabile che sia abituale. Inoltre ci sono altre conseguenze da eliminare. 1) se si sta utilizzando un gestore memoria specializzato e si ignorano gli operatori nuovi ed eliminati, è possibile che sia necessario effettuare un controllo per ulteriori dettagli

+6

'[citazione necessaria]'. È una cosa abbastanza semplice da aggiungere, e IIRC C ha garantito che 'free' gestisce correttamente' NULL' da sempre (almeno C89, non sarei sorpreso se fosse anche in ANSI C). Quindi trovo difficile credere che sia mai esistita un'implementazione C++ utilizzabile che non possa gestire 'cancella NULL;'. – delnan

1

Il controllo non è necessario.

The documentation Stati che cancellano sarà "deallocare il blocco di memoria puntato da ptr (se non nullo)"

0

maggior parte delle persone fare questo perché di solito hanno la manipolazione altrimenti (diverso da quello che io non vedo l'errore punto di controllo). In alcuni casi lo fanno per verificare che stiano liberando qualcosa e non cambiando accidentalmente un puntatore da qualche parte e causando una perdita di memoria non liberandola. free(NULL); dovrebbe funzionare in tutti i casi e non l'errore in uscita a meno che non ci sia la gestione degli errori in questione è possibile rimuovere la dichiarazione if e basta fare il libero.

Problemi correlati