运行发布构建的应用程序时出现访问冲突异常

Posted

技术标签:

【中文标题】运行发布构建的应用程序时出现访问冲突异常【英文标题】:Access Violation exception when running a release-built application 【发布时间】:2012-05-08 18:56:45 【问题描述】:

最近我一直在开发一个小型 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 以查找所需的文件。

【问题讨论】:

我怀疑崩溃的原因在于该代码。 检查您的代码是否包含任何asserts。 std::ifstream 构造函数不会抛出异常 AFAIK 我的代码中没有 'assert',我只是想说代码在该特定行中断。 在访问冲突发生时您试图访问哪个地址? baseName 是否有可能引用了取消引用 null 的结果,或者是无效的? 【参考方案1】:

根据个人(和教学)经验的一般规则:>90% 的 Debug 工作正常和 Release 崩溃的情况是由于未初始化的变量。这在 C++ 中比在 C 中更难做到,但这是一个非常常见的问题。确保你所有的变量(比如baseName)在使用它们之前都被初始化了。

【讨论】:

因为string 有一个默认构造函数,所以不可能得到一个未初始化的构造函数。不过还是不错的一般建议。【参考方案2】:

我解决了这个问题。

一切都发生了,因为我使用 glsdk 的调试构建库进行了发布构建。更改为 Release 构建库解决了这个问题。

【讨论】:

【参考方案3】:

检查 baseName 是否有效。尝试打印出来。您可能会得到一个损坏的 baseName 副本,或者您的堆栈可能在此之前已被丢弃(结果相同)。

【讨论】:

我在控制台打印出baseName,是有效的。只有文件名,没有其他符号,什么都没有。

以上是关于运行发布构建的应用程序时出现访问冲突异常的主要内容,如果未能解决你的问题,请参考以下文章

处理 ClientInsertServerInsert 同步冲突时出现 SQL 命令“超时”异常

尝试在 C++ 中通过引用乘以矩阵时出现访问冲突异常

WindowsError:异常:使用从 C++ 到 Python 的 ctypes 创建 DLL 时出现访问冲突或 Windows 错误 193

运行 GWT 应用程序时出现异常

SDL2访问冲突多个窗口

访问 ccomptr 指针和应用程序崩溃时访问冲突(c 系统异常代码:c0000005)