Нарушение доступа в режиме выпуска - PullRequest
2 голосов
/ 12 августа 2011

Я получаю сообщение об ошибке доступа в режиме выпуска, но не в режиме отладки.

Ошибка возникает при попытке закрыть файл, который был открыт для чтения данных. Это код:

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 я добавляю часы для этого контейнера. Когда программа пытается закрыть файл в приведенном выше коде, она делает недействительными все значения, хранящиеся в контейнере, и вылетает.

Оба набора кода не связаны между собой, они даже не являются частью одного и того же объекта, поэтому это наводит меня на мысль, что куча повреждена на некотором этапе.

Но почему только в режиме выпуска это происходит из-за оптимизации кода в режиме выпуска, а не в режиме отладки?

Ответы [ 2 ]

4 голосов
/ 12 августа 2011

вы должны использовать либо

transferFunctionData = new GLubyte[size];

, если вы хотите выделить массив GLubytes, либо

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

, если вы хотите выделить и прочитать один.Прямо сейчас вы выделяете один GLubyte и читаете размер, перезаписывая нераспределенную память

2 голосов
/ 23 ноября 2011

Я считаю, что достаточно включить параметр / EHa в настройках проекта Release (скорее всего, он включен в Debug).См. Свойства проекта -> C / C ++ -> Генерация кода -> Установите для параметра Разрешить исключения C ++ значение «Да с исключениями SEH» .Вот и все!

Подробнее здесь: http://msdn.microsoft.com/en-us/library/1deeycx5(v=vs.80).aspx

...