È sicuro cancellare un puntatore NULL?

È sicuro cancellare un puntatore NULL?

Ed è un buon stile di programmazione?

delete esegue comunque il check, quindi controllarlo da parte tua aggiunge overhead e sembra più brutto. Una buona pratica è impostare il puntatore su NULL dopo l’ delete (aiuta a evitare la doppia eliminazione e altri problemi di danneggiamento della memoria simili).

Mi piacerebbe anche se l’ delete di default fosse l’impostazione del parametro su NULL come in

 #define my_delete(x) {delete x; x = NULL;} 

(Conosco i valori R e L, ma non sarebbe bello?)

Dallo standard di bozza C ++ 0x.

$ 5.3.5 / 2 – “[…] In entrambe le alternative, il valore dell’operando di delete può essere un valore di puntatore nullo. [… ‘”

Naturalmente, nessuno farebbe mai “cancellare” un puntatore con valore NULL, ma è sicuro farlo. Idealmente non si dovrebbe avere il codice che cancella un puntatore NULL. Ma a volte è utile quando la cancellazione dei puntatori (ad esempio in un contenitore) avviene in un ciclo. Poiché la cancellazione di un valore di puntatore NULL è sicura, si può davvero scrivere la logica di cancellazione senza controlli espliciti per l’operando NULL da eliminare.

Per inciso, C Standard $ 7.20.3.2 dice anche che ‘libero’ su un puntatore NULL non esegue alcuna azione.

La funzione libera fa sì che lo spazio puntato da ptr sia deallocato, cioè reso disponibile per un’ulteriore allocazione. Se ptr è un puntatore nullo, non si verifica alcuna azione.

Sì, è sicuro.

Non c’è nulla di male nell’eliminare un puntatore nullo; spesso riduce il numero di test alla coda di una funzione se i puntatori non assegnati vengono inizializzati a zero e quindi semplicemente cancellati.


Poiché la frase precedente ha causato confusione, un esempio – che non è eccezionalmente sicuro – di ciò che viene descritto:

 void somefunc(void) { SomeType *pst = 0; AnotherType *pat = 0; … pst = new SomeType; … if (…) { pat = new AnotherType[10]; … } if (…) { …code using pat sometimes… } delete[] pat; delete pst; } 

Ci sono tutti i tipi di lendini che possono essere scelti con il codice di esempio, ma il concetto è (spero) chiaro. Le variabili puntatore vengono inizializzate a zero in modo che le operazioni di delete alla fine della funzione non debbano verificare se non sono nulle nel codice sorgente; il codice della libreria esegue comunque il controllo.

L’eliminazione di un puntatore nullo non ha alcun effetto. Non è uno stile di codifica necessariamente perché non è necessario, ma non è neanche male.

Se stai cercando buone pratiche di codifica, considera l’utilizzo di puntatori intelligenti, in modo che non sia necessario delete .

Per completare la risposta di ruslik, in C ++ 14 puoi usare quella costruzione:

 delete std::exchange(heapObject, nullptr); 

È sicuro a meno che non si sia sovraccaricato l’operatore di cancellazione. se sovraccarichi l’operatore di cancellazione e non gestisci la condizione nulla, allora non è affatto sicuro.

Ho sperimentato che non è sicuro (VS2010) cancellare [] NULL (cioè syntax dell’array). Non sono sicuro che sia conforms allo standard C ++.

È sicuro cancellare NULL (syntax scalare).