Чтобы чуть-чуть отвлечься от ругани в комментариях про третью часть логов, напишу провокационно-отвлеченное. Опять про мои любимые синглетоны.
static Obj* instance()
{
static Obj obj;
return &obj;
}
_Winnie C++ ColorizerВзглянем на ассемблерный код:
00401000
00401005
0040100B
0040100D
00401013
00401018
0040101D
00401022
00401027
0040102A
0040102Fmov eax,1
test byte ptr [$S1 (40301Ch)],al
jne main+2Ah (40102Ah)
or dword ptr [$S1 (40301Ch)],eax
mov ecx,offset obj (403018h)
call Obj::Obj (401030h)
push offset `instance'::`2'::`dynamic atexit destructor for 'obj'' (401820h)
call atexit (4010EEh)
esp,4
mov eax,offset obj (403018h)
ret
Или, в переводе на русский:
- проверить значение глобальной переменной по адресу 0x40301C
- если не 0, то перейти на 0x40102A (возвращаем указатель на объект)
- если 0, то: записать туда 1, вызвать конструктор, зарегистрировать деструктор объекта для функции atexit() (!)
- вернуть адрес объекта.
Если у вас несколько потоков, то есть шанс попасть на двойную инициализацию конструктора по адресу 0x00401018 - это произойдет в том случае, если два разных треда одновременно пройдут через инструкцию "test byte ptr [$S1 (40301Ch)],al".
Приятной вам отладки.