2010-12-21 104 views
1

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

没有看到您的代码,很难确切地知道是什么导致问题,但可能的原因是您正在写入对象的析构函数中的日志文件,但在调用析构函数之前关闭文件。 – 2010-12-21 18:39:01

+2

在执行了一个活动并与另一方的精神交谈之后,我被告知你的问题实际上在文件wtf_you_want_me_to_guess.cpp的第42行。 – 2010-12-21 18:42:18

回答

2

对于用于构建SDL库的主程序,您是否使用了相同的运行时库(调试DLL,调试版,发布DLL,发行版等)?这通常会(但并非总是)造成奇怪的问题,并且在运行时遇到这种奇怪的行为时,它将成为我的第一个停靠点。

(如果你构建时LNK4098警告,这是它是想告诉你,你真的需要妥善解决这个问题。“解”的警语的文字说明是什么,但)

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

_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)|_CRTDBG_CHECK_ALWAYS_DF); 

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

-Edit:“_CRTDBG_REPORT_FLAG_DF”,可能是“_CRTDBG_REPORT_FLAG”。

3

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

1

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

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

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很有意思。