Я пишу тестовый код, используя Google C ++ Test Framework и забыл инициализировать определенный объект myObj
, Это приводит к следующей ошибке.
unknown file: error: SEH exception with code 0xc0000005 thrown in the test body
Проходя по соответствующему коду, оказывается, что вызов метода вида
myObj->method()
выполняется, пока myObj не инициализирован, то есть его значение 0x00000000
, Затем где-то глубоко в сторонней библиотеке эта ошибка выдается.
Как это может произойти? Почему он не генерирует исключение нулевой ссылки при вызове метода?
Как было справедливо указано в комментариях, вызов метода из неинициализированного указателя класса является неопределенным поведением, поэтому в зависимости от реализации компилятора может произойти все что угодно. Однако легко предсказать, почему в вашем случае исполнение было полууспешным. Единственная разница между классом (__thiscall
) члены и порядковые функции, это то, что они получают дополнительный скрытый аргумент, содержащий указатель на экземпляр класса (this
). Проходит компилятор Microsoft C ++ this
спорить через ecx/rcx
зарегистрироваться, другие компиляторы могут использовать другой подход. Однако, если ваш метод класса не пытается разыменовать недействительным this
Указатель, исключение не будет выдано, и, в зависимости от логики метода, ваша программа может даже продолжить выполнение без ошибок. Все было бы по-другому, если бы вы попытались вызвать виртуальный метод. В этом случае ваша программа попытается вычислить правильный адрес метода, используя класс vtable
, разыменовать неверный указатель и завершиться ошибкой с нарушением доступа, даже если сам метод не использует this
указатель.
Других решений пока нет …