Использование fstreams приводит к нарушению доступа после основного возврата

Следующая функция работает нормально, показывая текстовый файл построчно в stderr:

void load_text(std::string path){
  ifstream f(path);
  char linebuff[100];
  linebuff[99] = 0;
  while(!f.eof()){
    f.getline(linebuff, 99);
    std::cerr<<linebuff<<std::endl;
  }
  f.close();
}

Теперь, когда функция main возвращается, она выдает следующую ошибку нарушения доступа:

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

Как ни странно, создание ifstream, закрытие и возврат также выдает ошибку

//This also crashes when returning from main
void load_text(std::string path){
  ifstream f(path);
  f.close();
}

Есть идеи, почему это происходит?

Редактировать:

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

Сейчас я нахожусь в стадии "не могу воспроизвести":

#include <fstream>
#include <string>
#include <iostream>

//Using SDL for plotting
#ifdef WIN32
  #pragma comment(lib, "SDL")
  #pragma comment(lib, "SDLMain")
  #pragma comment(lib, "SDL_image")
#endif

int fn(std::string path){
    std::ifstream f(path);
    char linebuff[100];
    linebuff[99] = 0;
    while(!f.eof()){
      f.getline(linebuff, 99);
      std::cerr<<linebuff<<std::endl;
    }
    f.close();
    return 0;
}

int main(int argc, char** argv){
    fn("sscce.cpp");
    return 0;
}

1 ответ

По какой-то причине указание компилятору использовать библиотеки с использованием прагм - это не то же самое, что явно указать их в конфигурации. Удаляя прагмы и помещая файлы.lib в параметры компоновщика, он работает.

находится по адресу: http://www.gamedev.net/topic/600901-lock-file-access-violation/

Другие вопросы по тегам