OP: it's not legal to destroy or even access GC allocated members in a destructor. The GC may have already destroyed that data.
Isn't destroy() fine there? It doesn't call destructors for already destroyed objects, so I guess it should be safe. (assuming the destructors don't do any allocations)