У меня есть (довольно большое) приложение, которое я написал на C++, и до недавнего времени оно отлично работало вне Visual Studio с момента сборки релиза. Однако теперь, всякий раз, когда я запускаю его, он говорит: «Необработанное исключение по адресу 0x77cf205b в myprog.exe: 0xC0000005: место записи нарушения прав доступа 0x45000200.», и приводит меня к «crtexe.c» в строке 582 («mainret = main(argc, argv, envp);"), если я попытаюсь отладить его. Обратите внимание, что эта проблема никогда не проявляется, если я запускаю свой исполняемый файл отладки вне Visual Studio или если я запускаю свою отладочную или выпускную сборку в Visual Studio. Это происходит только при запуске сборки релиза вне Visual Studio.
Я просмотрел и поместил в него множество printfs и пару while(1), чтобы увидеть, когда он на самом деле разбился, и обнаружил, что нарушение прав доступа происходит именно в тот момент, когда значение возвращается из функции (я возврат указателя на объект). Я не совсем понимаю, почему я получаю нарушение доступа в момент его возврата, и, похоже, не имеет значения, что я возвращаю, поскольку это все еще происходит, когда я возвращаю 0.
Момент, когда он начал падать, был, когда я добавил функцию, которая много читает из файла, используя ifstream. Я открываю поток каждый раз, когда пытаюсь прочитать новый файл, и закрываю его, когда заканчиваю чтение.
Если я продолжу попытки запустить его, он будет запускаться примерно раз в 20 попыток. Это кажется намного более надежным, если я запускаю его с флешки (кажется, что он дает сбой первые 3 или 4 раза, а затем работает нормально - может быть, это из-за его более медленной скорости чтения).
Спасибо за вашу помощь, и если я что-то пропустил, дайте мне знать.
РЕДАКТИРОВАТЬ: Новая информация
Ну, я удалил всю функцию и заменил ее на:
IndexedMesh * loadObj(char * objName)
{
ifstream fp_in;
fp_in.open("lol.bmp", ios::in);
fp_in.clear();
fp_in.close();
IndexedMesh * mesh = new IndexedMesh();
printf("finished");
return mesh;
}
Я также пробовал с «вернуть 0» и «вернуть новый IndexedMesh ()». Все в порядке, пока вы не вставите материал ifstream. У меня есть 2 других ifstream, открытых в разных функциях (доступ к совершенно разным файлам). Может ли это быть проблемой?
На самом деле это ошибки на линии возврата сетки (у меня отладчик работает с отдельным файлом релиза). Он полностью обнуляет объект сетки, когда пытается его вернуть.