The first is called RAII. When you can use it you should. But there are several instances where you won't, but use some kind of factory instead. Nevertheless, RAII is the important concept here.http://en.wikipedia.org/wiki/RAII

The second form is called two stage construction. It's a common pattern in MFC for example. You'd only resort to this if you can't do RAII.

However, could you provide an example or two of a situation when RAII couldn't work?

One example is when the initialisation of the object requires a call to a virtual method of that object . You can't make that method call in the constructor, because the vtable of an object isn't guaranteed to be fully created until after the construction of the object has been completed - i.e. after all the constructors have finished.

When that happens, you need a second stage, so that you can perform that initialisation after the object has been constructed.

kbw, the second method can also be a form of RAII, having more to do with how exceptions are handled. It's not always a smart idea to throw an exception in the constructor (rather, this is a caveat in the C++ FQA which is one of the few complaints that are valid). You can just hold a validation boolean, then check it during destruction. Not very pretty but yeah.

EDIT: For arguments sake though, it's not the worst evil to throw excceptions in the constructor. The conditions are slightly confusing: http://www.parashift.com/c++-faq-lite/ctors-can-throw.html