This frees everything, which isn't what you want. What if you've passed your pointer off to somewhere else where it's still in use?
> Better yet, simply free memory at the exception throw site, if possible.
Most of the time, your exceptions are coming from low levels, like IO libraries, that don't know anything about the memory that you've allocated.
Yeah, but that's why you put exception handlers around anything that you expect to throw an exception, IO being a big one. Dealing with memory cleanup is definitely something that should be handled in the function allocating the memory.
The thing about an exception is that you can't do about it in a number of scopes. When you encounter the exception you just just jump to the scope where you can do something about it.
If you use libraries that use internal malloc'ed memory, etc, you have to clean at the exception call site by calling the library cleanup function.
Better yet, simply free memory at the exception throw site, if possible.