The OS this is happening on would be helpful, but first impression is that you're not helping by explicitly trying to explicitly undef or otherwise zero out your data structures. On most OSen it's not possible to return memory from a running process (Windows and I believe several flavours of *BSD can) short of the process terminating. If anything you're probably making the underlying malloc/free machinery do extra work putting all that memory back into its free lists for nothing (since you're already exiting it's not going to be reused by the current process).
A utility like strace/truss/ktrace might be of use to see what sort of system calls are being made during the period after you've started exiting (if any, which may shed light on what's going on and leaving you hung).
Update: Expanded with parenthetical in second paragraph.
The cake is a lie.
The cake is a lie.
The cake is a lie.