Looks good, but std::auto_ptr<> is declared in <memory> and std::endl is only guaranteed to be declared in <ostream> i.e. <iostream> probably will declare it, but it's not guaranteed by the C++ standard.
Also, your last example uses a class that is dangerous to copy. I'd recommend either declaring but not implementing a private copy-constructor and copy-assignment operator, or implementing public versions of each that make deep copies (but be careful with polymorphic base classes!). As an extension to your article, have a look at std::tr1::shared_ptr aka boost::shared_ptr and boost::weak_ptr. They're even more useful than auto_ptr! And using a shared_ptr instead of auto_ptr in your last example will automagically make it safe to copy.
For a similar hand-coded shared pointer implementation have a look at mine:
http://www.nunswithguns.net/guff/core/ptr.h and shared.h for core::ptr and core::array and their base class which provides reference-counted auto-destroy sematics for any class. An example using FILE* is given, which is fclose()d automatically when the last copy goes out of scope.
I plan on changing them to remove the exception specifications and to use the protected destructor idiom. In fact I'll write that on the back of my hand to do tonight!!
Also, if you're feeling really adventurous, check out Andrei Alexandrescu's policy-based smart-pointer in "Modern C++ design".
Edd