2010-12-21 96 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很有意思。