Sim.
O único "dano" que isso pode causar é introduzir ineficiência (uma operação desnecessária de armazenamento) em seu programa - mas essa sobrecarga será insignificante em relação ao custo de alocar e liberar o bloco de memória na maioria dos casos.
Se você não fizer isso, terá alguns erros desagradáveis de apontador um dia.
Eu sempre uso uma macro para excluir:
#define SAFEDELETE(ptr) { delete(ptr); ptr = NULL; }
(e semelhante para uma matriz, livre (), liberando identificadores)
Você também pode escrever métodos de "exclusão automática" que fazem referência ao ponteiro do código de chamada, para forçar o ponteiro do código de chamada para NULL. Por exemplo, para excluir uma subárvore de muitos 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
Sim, essas técnicas violam algumas regras sobre o uso de macros (e sim, hoje em dia você provavelmente poderia obter o mesmo resultado com modelos) - mas, ao longo de muitos anos, nunca acessei a memória morta - uma das mais desagradáveis e mais difíceis. consome mais tempo para depurar problemas que você pode enfrentar. Na prática, durante muitos anos, eles efetivamente eliminaram uma classe de bugs de todos os times em que os introduzi.
Também há várias maneiras de implementar o acima - estou apenas tentando ilustrar a idéia de forçar as pessoas a NULL um ponteiro se elas excluírem um objeto, em vez de fornecer um meio para liberar a memória que não NULL o ponteiro do chamador .
Obviamente, o exemplo acima é apenas um passo em direção a um ponteiro automático. O que eu não sugeri porque o OP estava perguntando especificamente sobre o caso de não usar um ponteiro automático.
delete
Porém, é seguro para um ponteiro nulo, que é uma das razões pelas quais zerar um ponteiro pode ser bom.