繁体   English   中英

程序退出时崩溃

[英]Program crashing on exit

每当我退出程序时,它都会给我这个异常“ 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项目。

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

您是否在主程序上使用了与构建SDL库相同的运行时库(调试DLL,调试,发布DLL,发布等)? 这可能经常(但并非总是)导致奇怪的问题,并且在运行时出现这种奇怪的行为时,这将是我的第一个电话口。

(如果在构建时收到LNK4098警告,这就是它要告诉您的内容,那么您确实需要对其进行正确修复;警告文字所建议的“解决方案”不过是什么。)

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

_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)|_CRTDBG_CHECK_ALWAYS_DF);

这将激活更彻底的堆检查。 (如果您在程序运行时分配了很多东西,那么您可能需要在打开程序的情况下去喝杯茶。)如果那样,那么其中一个内存分配函数就会“崩溃”,这实际上是一个断言,但您不能总是知道-然后在该调用与上次对内存管理函数的调用之间的某个时刻,某些内容已覆盖了本不应该拥有的某些内存。 您可以从那里拿走,找出原因。

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

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

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

您怎么知道您的应用程序最初是在执行的? 在调用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还是其他?

我发现这篇文章非常有趣。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM