[英]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.