The rule of thumb for exceptions in destructor: they must never throw.
Desctructor can be called in one of two ways:
normal mode
call during exception handling
in the later emitting an exception cause undefined behaviour most likely terminate()
~X::X() throw()
try
{
...
}
catch( ... ) { ... }
Destructor must never emit exception!