Double delete means calling delete on the same pointer twice. The first delete frees the memory. The second delete tries to free already-freed memory, corrupting the heap's internal structures.
Symptoms include crashes, but often not until much later when the corrupted heap is used again. This makes double delete bugs hard to track down. The crash site isn't the bug location.
Setting pointers to nullptr after delete prevents double delete. Deleting nullptr does nothing, so accidental second deletes become harmless. Smart pointers eliminate this risk entirely.