0

最近、小さな OpenGL ゲームを開発しています。その中のすべてがデバッグ ビルドで正常に動作しますが、リリースをビルドすると、奇妙なアクセス違反例外が発生します。

コード全体を検索したところ、ファイルを開こうとすると問題が発生するようです。問題が発生していると思われる関数は次のとおりです。

#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 に渡します。

4

3 に答える 3

2

個人的な (および教育の) 経験からの一般的なルールとして、Debug が正常に動作し、Release がクラッシュするケースの >90% は、初期化されていない変数が原因です。これは、C よりも C++ で行う方が少し難しいですが、非常に一般的な問題です。使用する前に、すべての変数 ( などbaseName) が初期化されていることを確認してください。

于 2012-05-08T20:57:04.023 に答える
1

問題を修正しました。

glsdk のデバッグ ビルド ライブラリを使用してリリース ビルドを作成したため、すべてが起こっていました。Release ビルド ライブラリに変更すると、問題が修正されました。

于 2012-05-09T14:51:36.153 に答える
0

baseName が有効であることを確認してください。印刷してみてください。baseName の破損したコピーを取得しているか、その時点より前にスタックが破棄されている可能性があります (同じ結果)。

于 2012-05-08T19:44:28.567 に答える