Do not rely on implict copy constructors when destructor defined
As a general C++ "rule of three," if one of a copy constructor, copy assignment, or destructor is defined, all three should be defined. Some compilers issue warnings if this rule of three is violated.
It is sometimes the case that we define a destructor simply because it is only valid in the control environment. When doing so, add implementations for copy constructor and assignment as well.