Сбой программы при выходе - PullRequest
       34

Сбой программы при выходе

1 голос
/ 21 декабря 2010

Всякий раз, когда я выхожу из своей программы, это выдает мне исключение: «0xC0000022: процесс запросил доступ к объекту, но ему не были предоставлены эти права доступа».

Он прерывается прямо в конце функцииназывается _lock_file в _file.c.

После попытки выяснить, в чем причина проблемы, я обнаружил, что она не падает, если я удаляю все вызовы функций fclose () в моей программе, а затем очищаю и перестраиваюпрограмма.Даже если сама функция никогда не вызывается, она все равно завершится сбоем.Очевидно, что это решение не является идеальным.

Когда я попытался использовать вместо него fstream, при запуске программы происходил похожий сбой.

Стоит также упомянуть, что моя программа использует SDL.

Редактировать: Кто-то запросил минимальный пример, и это то, с чем я могу связаться.

main.cpp

#include <stdlib.h>
#include <SDL.h>
/*...*/
#pragma comment(lib, "SDL.lib")
#pragma comment(lib, "SDLmain.lib")
/*...*/
int main( int argc, char **argv)
{
    if(false)
        fclose(NULL);
    return 0;
}

draw.cpp

/*...*/

Если я запустлю это, он выйдет из строя при выходе, как я уже упоминал выше.И да, файл draw.cpp полностью закомментирован, но если я удалю его из проекта, программа будет работать нормально.Все остальные файлы были удалены из проекта.

Edit2: В ответ на karlphillip я решил перепроверить, действительно ли он запущен, и кажется, что он действительно падает в начале этого примера.

Также это проект Win32.

Ответы [ 4 ]

3 голосов
/ 21 декабря 2010

Сбой при выходе обычно означает, что куча повреждена во время выполнения программы.Попробуйте использовать проверку памяти, чтобы найти, где.Попробуйте использовать _CrtDumpMemoryLeaks ()

2 голосов
/ 21 декабря 2010

Используете ли вы для своей основной программы ту же библиотеку времени выполнения (Debug DLL, Debug, Release DLL, Release и т. Д.), Которая использовалась для построения библиотеки SDL? Это может часто (но не всегда) вызывать странные проблемы и будет моим первым портом захода при получении такого рода странного поведения во время выполнения.

(Если вы получаете предупреждение LNK4098 при сборке, это то, что он пытается вам сказать, и вам действительно нужно исправить это должным образом; «решение», которое предлагает текст предупреждения, совсем другое.)

Другой вариант - повреждение памяти. Попробуйте запустить отладочную сборку и вызвать следующее при запуске:

_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)|_CRTDBG_CHECK_ALWAYS_DF);

Это активирует более тщательную проверку кучи. (Возможно, вам придется пойти и приготовить чашку чая, когда ваша программа работает с этим включенным, если она выделяет много вещей во время работы.) Если затем «вылетает» в одной из функций выделения памяти - это фактически утверждение Вы не всегда можете сказать, что в какой-то момент между этим вызовом и предыдущим вызовом функции управления памятью что-то перезаписало память, которой не должно быть. И вы можете взять его оттуда, чтобы узнать, что.

-Edit: "_CRTDBG_REPORT_FLAG_DF", вероятно, должно было быть "_CRTDBG_REPORT_FLAG".

1 голос
/ 21 декабря 2010

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

Проверьте статические объекты и убедитесь, что их деструкторы не вызывают сбой.

0 голосов
/ 21 декабря 2010

Откуда вы знаете, что ваше приложение выполняется в первую очередь?Добавьте отладку сразу после вызова main ():

#include <stdlib.h>
#include <SDL.h>
/*...*/
#pragma comment(lib, "SDL.lib")
#pragma comment(lib, "SDLmain.lib")
/*...*/
int main( int argc, char **argv)
{
    printf("dbg1\n");

    if(false)
        fclose(NULL);

    printf("dbg2\n");

    return 0;
}

Какой проект вы создаете?Консоль, Win32 или что-то еще?

Я считаю этот пост очень интересным.

...