Ne, to obvykle nestačí. delete x nenastaví x na 0. A stejně by se tím neošetřil případ typu:
int* p1 = new int(10);
int* p2 = p1;
// ...
delete p1;
p1 = 0;
// ...
// A tady zkusím použít *p2, což vede k chybě, protože p2 odkazuje na uvolněnou paměť.
*p2 = 12345;
V programu je nutné si hlídat to, aby byl vždy jenom jeden vlastník dynamicky alokovaných dat. Tento vlastník se může změnit, ale nemůžou být zároveň dva vlastníci. Tento vlastník je pak jediný, kdo může data uvolnit.
Pokud je řešení vlastnictví obtížné, lze využít i nějakých "chytrých" ukazatelů s reference countingem, které si počítají, kolikrát je daný ukazatel odkazován. V případě, že už ten ukazatel nikdo nereferencuje, paměť je uvolněna. Není to všelék (např. pro cyklické odkazy to dělá problémy), ale je to poměrně snadno a efektivně použitelná věc.