Danger of destructors: objects are copied in many situations.
We need to make sure that the copies are deep copies
and not shallow copies. Otherwise, when a destructor is called
it frees the memory that other objects are still pointing to.
Examples of bad behavior:
Using delete instead of delete  :
After initializing with DMC X = DMC(Y) :
Note: default copy constructor called instead of
Passing a DMC by value:
Returning a DMC value:
Explicitly calling a destructor:
Explicitly calling a destructor thru a pointer: