Sì.
L'unico "danno" che può fare è introdurre inefficienza (un'operazione di archiviazione non necessaria) nel programma - ma questo sovraccarico sarà insignificante rispetto al costo di allocazione e liberazione del blocco di memoria nella maggior parte dei casi.
Se non lo fai, ti sarà avere alcune brutte puntatore bug derefernce un giorno.
Uso sempre una macro per eliminare:
#define SAFEDELETE(ptr) { delete(ptr); ptr = NULL; }
(e simili per un array, free (), rilasci di handle)
È inoltre possibile scrivere metodi di "eliminazione automatica" che prendono un riferimento al puntatore del codice chiamante, in modo da forzare il puntatore del codice chiamante su NULL. Ad esempio, per eliminare una sottostruttura di molti oggetti:
static void TreeItem::DeleteSubtree(TreeItem *&rootObject)
{
if (rootObject == NULL)
return;
rootObject->UnlinkFromParent();
for (int i = 0; i < numChildren)
DeleteSubtree(rootObject->child[i]);
delete rootObject;
rootObject = NULL;
}
modificare
Sì, queste tecniche violano alcune regole sull'uso delle macro (e sì, in questi giorni probabilmente potresti ottenere lo stesso risultato con i modelli) - ma usando molti anni non ho mai avuto accesso alla memoria morta - uno dei più cattivi e difficili e la maggior parte del tempo necessario per il debug dei problemi che si possono affrontare. In pratica per molti anni hanno eliminato efficacemente una intera classe di bug da ogni squadra su cui li ho introdotti.
Esistono anche molti modi per implementare quanto sopra: sto solo cercando di illustrare l'idea di forzare le persone a NULL un puntatore se eliminano un oggetto, piuttosto che fornire loro un mezzo per liberare la memoria che non NULL il puntatore del chiamante .
Naturalmente, l'esempio sopra è solo un passo verso un puntatore automatico. Il che non ho suggerito perché l'OP stava specificatamente chiedendo il caso di non usare un puntatore automatico.
delete
un puntatore nullo, tuttavia, che è una ragione per cui azzerare un puntatore può essere buono.