If you needed to allocate a huge array (and didn't want to use a vector or std::tr1::array for some reason), so you use the heap instead of a local array.

If you had two derived classes (that may violate your main-only requirement) and wanted to instantiate one or the other depending on some variable, you would use a Base class pointer and use new in an if/else block. You wouldn't use a reference in that case since it would go out of scope if you initialized it in the if/else block.