Si.
El único "daño" que puede hacer es introducir ineficiencia (una operación de almacenamiento innecesaria) en su programa, pero esta sobrecarga será insignificante en relación con el costo de asignar y liberar el bloque de memoria en la mayoría de los casos.
Si no lo hace, usted va a tener algunos errores derefernce puntero desagradables un día.
Siempre uso una macro para eliminar:
#define SAFEDELETE(ptr) { delete(ptr); ptr = NULL; }
(y similar para una matriz, free (), tiradores de liberación)
También puede escribir métodos de "eliminación automática" que tomen una referencia al puntero del código de llamada, de modo que fuercen el puntero del código de llamada a NULL. Por ejemplo, para eliminar un subárbol de muchos objetos:
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;
}
editar
Sí, estas técnicas violan algunas reglas sobre el uso de macros (y sí, en estos días probablemente podría lograr el mismo resultado con las plantillas), pero al usarlas durante muchos años nunca he accedido a la memoria muerta, una de las más desagradables y difíciles La mayor parte del tiempo para depurar los problemas que puede enfrentar. En la práctica, durante muchos años, han eliminado eficazmente una gran variedad de errores de cada equipo en el que los he presentado.
También hay muchas maneras de implementar lo anterior: solo estoy tratando de ilustrar la idea de obligar a las personas a anular un puntero si eliminan un objeto, en lugar de proporcionarles un medio para liberar la memoria que no anula el puntero de la persona que llama. .
Por supuesto, el ejemplo anterior es solo un paso hacia un puntero automático. Lo cual no sugerí porque el OP estaba preguntando específicamente sobre el caso de no usar un puntero automático.
delete
embargo, es seguro para un puntero nulo, que es una razón por la cual poner a cero un puntero puede ser bueno.