Order of destruction isn't up for grabs by compiler writers - it's set by the standard. If you have two objects a and b, declared as:
A a;
B b;
then the destructor of b is always going to be called first. So if b depends on a it will always be destroyed before its dependent object.
So what you've got to ask yourself is... what dodgy practice are you doing that will kill the process? I'd be more inclined to say that VC++6 is likely to be the culprit - it's an antique compiler that isn't particularly good at doing standard things and lets you get away with all sorts of rubbish that a relatively modern compiler (like gcc 4.x) won't.
So...
- crank up the warnings on both compilers to /W4 /WX
- get a new version of VC++ - download the express edition and try compiling with that
- start writing unit tests to find out where you class goes wrong and under what circumstances. e.g. test the behaviour of the class when passed a randomly filled array of characters, a zero pointer, a pointer to an array of all zeros.
I can't be anymore specific than that as you haven't described what "Object" does except for taking a block of characters for some nefarious end.
Cheers,
Ash