Ошибка подтверждения до запуска программы - PullRequest
2 голосов
/ 06 октября 2010

Что происходит ?!Я исправил некоторые структуры, большое количество поиска / замены в моем коде.Затем я заканчиваю, и все прекрасно компилируется, но программа немедленно падает.

Это моя основная функция:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
    exit(1);

Во всех логиках не должно произойти сбой, так как я не выполняю никаких функций.только WinMain (), который ничего не делает!

Какого черта?И почему это не дает мне номера строк больше?он дает расположение во внешних включаемых файлах, а не строку в МОЕМ коде.

Также я заметил, что мой размер EXE теперь в 5 раз меньше, чем был раньше, что также не имеет смысла, похоже, он перестает компилироватьсяв какой-то момент, но все еще говорит, что он скомпилирован!

Редактировать: Вот что я получаю из ошибки:

File: ... \include\xstring
Line: 1084
Expression: Invalid null pointer

Когда я запускаю его в неотладкея получаю First-chance exception at 0x00413a95 ....: 0xC0000005: Access violation reading location 0x00000000.

-

Edit2: найдена причина: Я инициализировал глобальную структуру следующим образом: const StructName VarName = {1, 1, 1};, но StructName Struct был изменен.

Ответы [ 2 ]

2 голосов
/ 06 октября 2010

Конструкторы для глобальных и статических объектов вызываются до запуска программы. (Я не уверен, как это взаимодействует с WinMain(), хотя.)

Запустите ваше приложение под отладчиком, чтобы увидеть, как оно выходит из строя.

Из вашего добавленного описания кажется, что std::string инициализируется указателем NULL, что недопустимо. У вас есть глобальная / статическая строка, которая инициализируется с NULL / 0? Обычно это происходит при изменении типа переменной с char* (или char[]) на std::string.

0 голосов
/ 06 октября 2010

Как сказал @sbi, это скорее глобальные / статические объекты. По моему опыту, это (часто?) Происходит, если строковый объект находится в глобальной области видимости, на которую ссылается другой глобальный объект / код инициализации. Из-за недетерминированного порядка инициализации, строка может быть использована до того, как она была построена. Я бы посмотрел на эти случаи (ну, и, по возможности, избегал бы глобального кода).

Кстати, это может произойти с любыми объектами, а не только со строками. Обычно дело не в том, что объект не был инициализирован должным образом, а в том, что что-то использует его до инициализации (хотя ответ @ sbi также может быть причиной).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...