Today I came across this excellent analogy by a gentleman named "DavidWolfire" describing the initialisation, use and discarding of dynamically-allocated memory in C-like languages.

It stemmed from a question that had been interpreted to request a way to destruct a dynamically-allocated object and completely zero-out the memory underneath it, without actually losing the allocation itself.

Here it is:

If you call delete(ptr[5]), it is telling the OS that you no longer need the memory pointed to by ptr[5]. However! delete() will not re-initialize that memory for you. You can think of it like a sand castle — when you call new(), you draw a square on the beach to mark off the area you will use for your castle. Inside the square, the sand starts out in some random state, all lumpy with footprints from everyone else walking all over the beach. Then you use a constructor or initializer to shape the memory, forming your sand castle. Since you have your lines drawn in the sand, everyone else avoids your sand castle, and only you are allowed to touch it.

When you call delete(), you erase the lines in the sand. Your sand castle is still there, and you can still point to it, but it is no longer marked as off limits for others. Eventually people will start walking through it and claiming that sand for themselves, and moving pieces of your castle around to make their own. You can still point to the spot your castle used to be at, but your castle may or may not still be there — it could also contain bits and pieces of random castles created by other people.

In this metaphor, your question would be "How do I make my sand castle perfectly flat when I'm done with it?"