"Место записи нарушения прав доступа" с файлом file.getline? (Только в релизной сборке) - PullRequest
1 голос
/ 04 января 2012

Получение этой ошибки в приложении, написанном на C ++ (VS 2010):

Необработанное исключение в 0x77648da9 в файле divt.exe: 0xC0000005: Место записи нарушения доступа 0x00000014.

он указывает на эту функцию в free.c:

void __cdecl _free_base (void * pBlock)
{

        int retval = 0;


        if (pBlock == NULL)
            return;

        RTCCALLBACK(_RTC_Free_hook, (pBlock, 0));

        retval = HeapFree(_crtheap, 0, pBlock);
        if (retval == 0) //<-----------------------right here
        {
            errno = _get_errno_from_oserr(GetLastError());
        }
}

С помощью отладки я смог определить, где на самом деле происходит сбой:

void MenuState::LoadContentFromFile(char* File,std::string &Content)
{
    std::string strbuf;

    char buffer[1028];

    std::fstream file;
    file.open(File,std::ios_base::in);

    if(file.fail()) 
    {
        Content = ErrorTable->GetString("W0001");
        return;
    }
    if(file.is_open())
    {
        while(!file.eof())
        {
            file.getline(buffer,128,'\n');  // <----here
            strbuf = buffer;
            Content += strbuf + "\n";
        }
    }

    file.close();

    strbuf.clear();
}

Сбой в файле .getline (buffer, 128, '\ n');

Я не понимаю, почему, но он делает это только при сборке релиза (оптимизация выключена), при отладке он работает нормально.

Есть идеи?

Ответы [ 3 ]

3 голосов
/ 31 декабря 2012

Я знаю, что это старый вопрос, но когда вы сталкиваетесь с подобными проблемами, скрытыми глубоко в таких файлах, как free.c или xmemory, вы также можете дважды проверить конфигурацию вашего проекта. Особенно, когда проблема касается только определенных конфигураций сборки.

Например, в MSVC проверьте свойства проекта> Свойства конфигурации> C / C ++> Генерация кода> Библиотека времени выполнения. Убедитесь, что он согласован для всех зависимостей и что он установлен на вариант отладки / выпуска в зависимости от текущей сборки.

1 голос
/ 04 января 2012

Могу поспорить, что чтение до до чтения, приводящего к сбою, на самом деле завершилось неудачей (хотя я не совсем уверен, почему оно зависало)Важно отметить, что eof() - это только , что хорошо для определения причины сбоя чтения (и обычно для подавления сообщения об ошибке).Кроме того, вы всегда хотите проверить после чтения, было ли оно успешным.Наконец, я не вижу причин, почему вы не читаете std::string напрямую.Таким образом, попробуйте использовать этот цикл вместо:

for (std::string strbuf; std::getline(file, strbuf); ) {
    Content += strbuf;
}
0 голосов
/ 04 января 2012

Попросил друга о помощи, мы пришли к этому решению:

std::string strbuf;

char buffer[256] = "\0";

FILE* f = fopen(File, "rt");

while(fgets(buffer,sizeof(buffer),f) != NULL)
{
    Content += buffer;
}

fclose(f);
strbuf.clear();

Работает нормально, все равно спасибо за ваши усилия.

...