A smart pointer is an abstract data type that simulates a pointer, providing
additional features for accessing objects and managing memory at run-time, for
example, automatic destroying of unused objects, throwing of exceptions, inspecting
owners, or checking bounds.