Это странная проблема, и я не уверен, что с этим делать.
У меня есть что-то вроде следующего:
struct Parms
{
const std::string value1;
const std::string value2;
std::string parm1;
std::string parm2;
Parms() : parm1(value1), parm2(value1) {}
static const Parms& getDefaults()
{
static Parms defaults;
return defaults;
}
};
Который я обычно использую так:
Parms myParms = Parms::getDefaults();
myParms.parm1 = "crap";
functionThatNeedsParms(myParms);
Довольно просто. Это никогда не вызывало у меня головной боли, пока я не начал писать модульные тесты, использующие этот код, используя CxxTest. У меня есть два класса набора тестов в разных файлах, и когда я запускаю их по отдельности, все отлично.
Когда я запускаю их вместе, я вижу две плохие вещи. Во-первых, все это ядро сбрасывает, пытаясь дважды освободить статическую переменную по умолчанию. Во-вторых, если я посмотрю на содержимое defaults за некоторое время до того, как он умрет, но после того, как я начал его использовать, статические константы std::strings, которые там находятся, повреждены (некоторые буквы случайно изменились, хотя это всегда одно и то же при каждом запуске).
Что здесь происходит?