У меня странные проблемы со статической инициализацией. Я использую генератор кода для создания структур и кода сериализации для системы передачи сообщений, которую я написал. Чтобы можно было легко распределять сообщения на основе их идентификатора, у меня есть вывод кода моего генератора кода, похожий на следующий для каждого типа сообщения:
MessageAllocator s_InputPushUserControllerMessageAlloc(INPUT_PUSH_USER_CONTROLLER_MESSAGE_ID, (AllocateMessageFunc)Create_InputPushUserControllerMessage);
Класс MessageAllocator в основном выглядит следующим образом:
MessageAllocator::MessageAllocator( uint32_t messageTypeID, AllocateMessageFunc func )
{
if (!s_map) s_map = new std::map<uint32_t, AllocateMessageFunc>();
if (s_map->insert(std::make_pair(messageTypeID, func)).second == false)
{
//duplicate key!
ASSERT(false, L"Nooooo!");
}
s_count++;
}
MessageAllocator::~MessageAllocator()
{
s_count--;
if (s_count == 0) delete s_map;
}
, где s _
map и s _
count являются статическими членами MessageAllocator. Это работает большую часть времени, но иногда сообщения не добавляются на карту. Например, это конкретное сообщение не добавляется, пока я не вызову Create _
InputPushUserControllerMessage () где-нибудь в моем коде запуска, однако другие сообщения работают нормально. Я подумал, что это может быть связано с неправильным компоновщиком, думая, что тип не имеет ссылки, и удалил его, поэтому я отключил это с помощью параметра / OPT: NOREF (я использую Visual Studio 2008 SP1), но это не дало никакого эффекта.
Мне известно о проблеме «фиаско статического порядка инициализации», но, насколько мне известно, порядок, в котором создаются эти объекты, не должен изменять результат, поэтому мне это кажется нормальным.
Любое понимание здесь будет оценено.