A smart pointer is similar to a regular (typed) pointer, such as "char*," except that when the pointer itself exits scope, the value it points to is also deleted.
You can use it as a regular pointer by using "->," but not as an actual pointer to the data.
You can do this by using "&*ptr."
It can be used for:
Objects that must be allocated with new but have the same lifetime as something on that stack.
If the object is linked to a smart pointer, it will be destroyed when the program exits that function/block.
Class data members, so that when the object is deleted, all owned data is also deleted, with no special code in the destructor (you will need to be sure the destructor is virtual, which is almost always a good thing to do).