程序在退出时崩溃

时间:2010-12-21 18:35:37

标签: c++ c visual-studio-2010 crash sdl

每当我退出程序时,它都会给我这个异常“0xC0000022:进程已请求访问某个对象,但尚未授予这些访问权限。”

它在_file.c中名为_lock_file的函数的末尾处中断。

在尝试缩小问题原因后,我发现如果我删除程序中的所有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 个答案:

答案 0 :(得分:3)

退出时崩溃通常意味着在程序执行期间堆已损坏。尝试使用内存检查器查找位置。尝试使用_CrtDumpMemoryLeaks()

答案 1 :(得分:2)

您是否正在使用与用于构建SDL库的主程序相同的运行时库(调试DLL,调试,发行DLL,发行版等)?这通常(但不总是)导致奇怪的问题,并且在运行时获得这种奇怪的行为时将成为我的第一个调用端口。

(如果您在构建时收到LNK4098警告,这就是它试图告诉您的内容,您确实需要正确修复它;警告文本的“解决方案”建议不过是这样。)

另一种选择是内存损坏。考虑运行调试版本,并在启动时调用以下内容:

_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)|_CRTDBG_CHECK_ALWAYS_DF);

这会激活更彻底的堆检查。 (当你的程序运行时,你可能不得不去喝杯茶,如果它在运行时分配了很多东西。)如果然后在其中一个内存分配函数中“崩溃” - 它实际上是一个断言,你不能总是说 - 然后在那个调用之间的某个时刻,以及之前对内存管理函数的调用,有些事情已经覆盖了一些不应该有的内存。你可以从那里拿走它,找出答案。

-Edit:“_ CRTDBG_REPORT_FLAG_DF”,可能是“_CRTDBG_REPORT_FLAG”。

答案 2 :(得分:1)

退出时崩溃也可能是由静态变量破坏和访问已清理过的对象引起的。

检查静态对象并确保它们的析构函数不会导致崩溃。

答案 3 :(得分:0)

您如何知道您的应用程序首先被执行?调用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或其他什么?

我发现this post非常有趣。