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