2012-05-08 96 views
0

最近我一直在開發一個小型的OpenGL遊戲。它的所有內容都可以在調試版本中正常運行,但是當我構建版本時,會出現奇怪的Access Violation異常。運行發佈版應用程序時訪問衝突異常

我搜遍了整個代碼,看起來問題出現在我嘗試打開文件時。以下是我認爲問題來自的功能:

#define LOCAL_FILE_DIR "data\\" 
#define GLOBAL_FILE_DIR "..\\data\\" 

std::string FindFile(const std::string &baseName) 
{ 
    std::string fileName = LOCAL_FILE_DIR + baseName; 
    std::ifstream testFile(fileName.c_str()); // The code breaks here 
    if(testFile.is_open()) 
     return fileName; 

    fileName = GLOBAL_FILE_DIR + baseName; 
    testFile.open(fileName.c_str()); 
    if(testFile.is_open()) 
     return fileName; 

    throw std::runtime_error("Could not find the file " + baseName); 
} 

此代碼與加載GLSL着色器相關聯。函數使用着色器的文件名,然後將其傳遞給FindFile以查找所需的文件。

+3

我懷疑崩潰的原因是在代碼中。 –

+0

檢查你的代碼是否包含任何'assert'。 –

+0

'std :: ifstream'構造函數不會拋出異常AFAIK – AJG85

回答

1

我解決了這個問題。

一切都在發生,因爲我已經使用glsdk的Debug構建庫製作了發佈版本。更改爲發佈構建庫解決了問題。

0

檢查baseName是否有效。嘗試打印出來。你可能會得到一個損壞的baseName副本,或者你的堆棧可能在該點之前被刷新(相同的結果)。

+0

我在控制檯中輸出'baseName',它是有效的。只是文件名,沒有其他符號,沒有任何東西。 – Tsvetan

1

正如來自個人(和教學)經驗的一般規則:>調試工作正常且發佈崩潰是由於未初始化的變量導致> 90%的情況。這在C++中比在C中有點難,但這是一個非常普遍的問題。確保所有變量(如baseName)在使用之前都已初始化。

+0

因爲'string'有一個默認的構造函數,所以不可能得到一個未初始化的構造函數。不過還是很好的一般建議。 –