Preprocessor macros are bad when they make programs perform in ways users don't expect.
Preprocessor macros are bad when they make programs perform in ways users don't expect.
Preprocessor macros are bad when they make programs perform in ways users don't expect.
Preprocessor macros are bad when they make programs perform in ways users don't expect.
In this case OBJECT_TRAVERSAL() had no idea what to do with a std::string, and it's generating all this weird copy constructor crap and things aren't handled right.
Todo: move away from InitCopy() everywhere. And Init(). And InitXXX(). They make constructors for a reason, and we will assume our users are smart enough to not copy 2GB objects a bunch of times.