【问题标题】:Access violation in Release Mode发布模式下的访问冲突
【发布时间】:2011-08-12 19:11:13
【问题描述】:

我在发布模式下遇到访问冲突错误,但在调试模式下没有。

当我尝试关闭已打开以从中读取数据的文件时发生错误。这是代码:

FILE *file;
GLubyte *transferFunctionData = NULL;
transferFunctionData = new GLubyte(size);

if ( (file = fopen(fileName, "rb")) == NULL)
{
    printf("Cannot open file.\n");
    exit(1);
}

if ( fread(transferFunctionData, sizeof(GLubyte), size, file) != size)
{
    if (feof(file))
         printf("Premature end of file.");
    else
        printf("File read error.");

    exit(1);
}

fclose(file);

有趣的是,它将指针中的值更改为指针向量。不知道,我说得对,这是数据容器

vector<CustomObject*> *data;

在 Visual Studio 中,我为此容器添加了一个监视。当程序试图关闭文件时,在上面的代码中,它使容器中存储的所有值无效,并崩溃。

两组代码不相关,甚至不是同一个对象的一部分,所以这表明堆在某个阶段被破坏了。

但为什么只有在发布模式下,这是因为发布模式优化了代码,而调试模式没有?

【问题讨论】:

  • 这通常意味着您未能初始化一个变量(在调试中它将有一个默认值,在发布时它将有一个随机值)。检查编译器生成的警告(提高警告级别后)

标签: c++ visual-studio-2010 access-violation


【解决方案1】:

你应该使用任何一个

transferFunctionData = new GLubyte[size];

如果你想分配 GLubytes 数组或

fread(transferFunctionData, sizeof(GLubyte), 1, file)

如果你想分配和读取一个。现在你正在分配一个 GLubyte 和读取大小,覆盖未分配的内存

【讨论】:

  • 您的意思是在初始化 transferFunctionData 时将其设置为新的 GLubyte(size) 而不是我现在正在做的 NULL?
  • 否 - 假设您正在尝试分配 GLudata 数组 (transferFunctionData = new GLubyte(size);) - 您犯了一个错误并且使用了 () 而不是 []。 new() 是一种分配一个元素并调用初始化程序的语法。您需要改为分配数组
  • 啊当然!我真是太傻了!非常感谢:)
【解决方案2】:

我相信在 Release 项目设置中启用 /EHa 选项就足够了(可能在 Debug 中启用)。请参阅项目属性 -> C/C++ -> 代码生成 -> 将 Enable C++ Exceptions 修改为“Yes With SEH Exceptions”。就是这样!

在此处查看详细信息: http://msdn.microsoft.com/en-us/library/1deeycx5(v=vs.80).aspx

【讨论】:

  • 你完全从另一个答案中刷了这个,但它仍然很有用,所以我赞成;)
  • 我实际上已在同一屏幕上将“运行时库”更改为“多线程调试 DLL (/MDd)”,以便在发布模式下解决此问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多