Ja.
Der einzige "Schaden", den es anrichten kann, besteht darin, Ineffizienz (eine unnötige Speicheroperation) in Ihr Programm einzuführen. Dieser Overhead ist jedoch in den meisten Fällen im Verhältnis zu den Kosten für die Zuweisung und Freigabe des Speicherblocks unbedeutend.
Wenn Sie es nicht tun, Sie werden einige böse Zeiger derefernce Fehler eines Tages.
Ich benutze immer ein Makro zum Löschen:
#define SAFEDELETE(ptr) { delete(ptr); ptr = NULL; }
(und ähnliches für ein Array, free (), Freigabe von Handles)
Sie können auch "Selbstlösch" -Methoden schreiben, die auf den Zeiger des aufrufenden Codes verweisen, sodass der Zeiger des aufrufenden Codes auf NULL gesetzt wird. So löschen Sie beispielsweise einen Teilbaum vieler Objekte:
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;
}
bearbeiten
Ja, diese Techniken verstoßen gegen einige Regeln zur Verwendung von Makros (und ja, heutzutage könnten Sie wahrscheinlich das gleiche Ergebnis mit Vorlagen erzielen) - aber durch die Verwendung über viele Jahre habe ich nie auf toten Speicher zugegriffen - eine der schlimmsten und schwierigsten und Am zeitaufwändigsten ist das Debuggen von Problemen, mit denen Sie konfrontiert werden können. In der Praxis haben sie über viele Jahre hinweg eine ganze Klasse von Fehlern aus jedem Team, in dem ich sie vorgestellt habe, effektiv beseitigt.
Es gibt auch viele Möglichkeiten, wie Sie das oben Genannte implementieren können. Ich versuche nur, die Idee zu veranschaulichen, Menschen zu zwingen, einen Zeiger auf NULL zu setzen, wenn sie ein Objekt löschen, anstatt ihnen die Möglichkeit zu geben, den Speicher freizugeben, der den Zeiger des Aufrufers nicht auf Null setzt .
Das obige Beispiel ist natürlich nur ein Schritt in Richtung eines Auto-Zeigers. Was ich nicht vorgeschlagen habe, weil das OP speziell nach dem Fall gefragt hat, dass kein Auto-Zeiger verwendet wird.
delete
einen Nullzeiger, was ein Grund dafür ist, dass das Nullstellen eines Zeigers gut sein kann.