Может ли неявный компилятор, созданный конструктор по умолчанию, иметь больше, чем нулевое тело? ⇐ C++
-
Гость
Может ли неявный компилятор, созданный конструктор по умолчанию, иметь больше, чем нулевое тело?
Согласно веб-сайту IBM, ответ: нет.
Однако у меня есть проект, который меня ставит в тупик:
Здесь объявляется экземпляр класса StackWalkerToConsole без определенного конструктора по умолчанию:
void func5() { StackWalkerToConsole SW; ... } Это каким-то образом приводит к вызову одного из пользовательских конструкторов его родительского класса:
StackWalker::StackWalker(int options, LPCSTR szSymPath, DWORD dwProcessId, HANDLE hProcess) { // У функции есть тело, я просто удалил его для ясности. ... } Поэтому я поставил точку останова на этот конструктор и, используя стек вызовов, посмотрел на конструктор по умолчанию для StackWalkerToConsole. Поскольку он не определен в исходном коде, я мог только посмотреть его дизассемблирование:
StackWalker_VC2017.exe!StackWalkerToConsole::StackWalkerToConsole(void): 0000000140008210 mov qword ptr [rsp+8],rcx 0000000140008215 нажмите RDI 0000000140008216 суб-рсп, 40ч 000000014000821A вызов qword ptr [__imp_GetCurrentProcess (014012E060h)] 0000000140008220 mov qword ptr [rsp+30h],rax 0000000140008225 вызов qword ptr [__imp_GetCurrentProcessId (014012E068h)] 000000014000822B mov rcx,qword ptr [rsp+30h] 0000000140008230 mov qword ptr [rsp+20h],rcx 0000000140008235 мов r9d,eax 0000000140008238 xor r8d,r8d 000000014000823B мов edx,3Fh 0000000140008240 mov rcx,qword ptr [это] 0000000140008245 вызов StackWalker::StackWalker (0140002F1Dh) 000000014000824A mov rax,qword ptr [это] 000000014000824F lea rcx, [StackWalkerToConsole::`vftable' (01400ED6C0h)] 0000000140008256 mov qword ptr [rax],rcx 0000000140008259 mov rax,qword ptr [это] 000000014000825E добавить RSP, 40h 0000000140008262 поп рди Этот конструктор, определенный компилятором, вызывает две функции WinApi: GetCurrentProcess и GetCurrentProcessId и вызывает пользовательский конструктор для StackWalker.
Кто-нибудь знает, почему это так? Следует отметить, что родительский класс StackWalker также не имеет пользовательских конструкторов по умолчанию.
Если потребуется дополнительная информация, я буду рад ее предоставить. Спасибо, что дочитали до этого момента.
Изменить: это код на GitHub: это крошечный проект, всего 1 файл cpp и 1 файл main.cpp для его тестирования. Я предполагаю, что ни у кого нет времени и сил разбираться с кодом, но на всякий случай оставлю его здесь.
В сообщении я ссылаюсь на строку 41 из main.cpp и строку 929 из StackWalker.cpp
Согласно веб-сайту IBM, ответ: нет.
Однако у меня есть проект, который меня ставит в тупик:
Здесь объявляется экземпляр класса StackWalkerToConsole без определенного конструктора по умолчанию:
void func5() { StackWalkerToConsole SW; ... } Это каким-то образом приводит к вызову одного из пользовательских конструкторов его родительского класса:
StackWalker::StackWalker(int options, LPCSTR szSymPath, DWORD dwProcessId, HANDLE hProcess) { // У функции есть тело, я просто удалил его для ясности. ... } Поэтому я поставил точку останова на этот конструктор и, используя стек вызовов, посмотрел на конструктор по умолчанию для StackWalkerToConsole. Поскольку он не определен в исходном коде, я мог только посмотреть его дизассемблирование:
StackWalker_VC2017.exe!StackWalkerToConsole::StackWalkerToConsole(void): 0000000140008210 mov qword ptr [rsp+8],rcx 0000000140008215 нажмите RDI 0000000140008216 суб-рсп, 40ч 000000014000821A вызов qword ptr [__imp_GetCurrentProcess (014012E060h)] 0000000140008220 mov qword ptr [rsp+30h],rax 0000000140008225 вызов qword ptr [__imp_GetCurrentProcessId (014012E068h)] 000000014000822B mov rcx,qword ptr [rsp+30h] 0000000140008230 mov qword ptr [rsp+20h],rcx 0000000140008235 мов r9d,eax 0000000140008238 xor r8d,r8d 000000014000823B мов edx,3Fh 0000000140008240 mov rcx,qword ptr [это] 0000000140008245 вызов StackWalker::StackWalker (0140002F1Dh) 000000014000824A mov rax,qword ptr [это] 000000014000824F lea rcx, [StackWalkerToConsole::`vftable' (01400ED6C0h)] 0000000140008256 mov qword ptr [rax],rcx 0000000140008259 mov rax,qword ptr [это] 000000014000825E добавить RSP, 40h 0000000140008262 поп рди Этот конструктор, определенный компилятором, вызывает две функции WinApi: GetCurrentProcess и GetCurrentProcessId и вызывает пользовательский конструктор для StackWalker.
Кто-нибудь знает, почему это так? Следует отметить, что родительский класс StackWalker также не имеет пользовательских конструкторов по умолчанию.
Если потребуется дополнительная информация, я буду рад ее предоставить. Спасибо, что дочитали до этого момента.
Изменить: это код на GitHub: это крошечный проект, всего 1 файл cpp и 1 файл main.cpp для его тестирования. Я предполагаю, что ни у кого нет времени и сил разбираться с кодом, но на всякий случай оставлю его здесь.
В сообщении я ссылаюсь на строку 41 из main.cpp и строку 929 из StackWalker.cpp
Мобильная версия