我在发布模式下遇到访问冲突错误,但没有调试模式。
当我尝试关闭打开以从中读取数据的文件时发生错误。这是代码:
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中,我为此容器添加了一个监视。当程序试图关闭文件时,在上面的代码中,它会使存储在容器中的所有值无效并崩溃。
这两组代码都不相关,甚至不是同一个对象的一部分,所以这告诉我堆在某个阶段会被破坏。
但是为什么只有在发布模式下,这是由于发布模式优化代码,哪种调试模式没有?
答案 0 :(得分:4)
你应该使用
transferFunctionData = new GLubyte[size];
如果要分配GLubytes数组或
fread(transferFunctionData, sizeof(GLubyte), 1, file)
如果你想分配和阅读一个。现在你正在分配一个GLubyte和读取大小,覆盖未分配的内存
答案 1 :(得分:2)
我相信在Release项目设置中启用/ EHa选项就足够了(可能是在Debug中启用)。请参阅项目属性 - &gt; C / C ++ - &gt;代码生成 - &gt;将“启用C ++例外”修改为“是和SEH例外”。就是这样!
详情请见: http://msdn.microsoft.com/en-us/library/1deeycx5(v=vs.80).aspx