Необработанное исключение с приложением c ++ в сборке выпуска Visual Studio 2008 - возникает при возврате из функции - PullRequest
1 голос
/ 10 апреля 2010

У меня есть (довольно большое) приложение, которое я написал на 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;
}

Я также попытался сделать это с «return 0» и «return new IndexedMesh ()». Все нормально, пока вы не добавите в него поток ifstream. У меня есть еще 2 открытых потока ifstream в разных функциях (доступ к совершенно другим файлам). Может ли это быть проблемой?

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

Ответы [ 3 ]

1 голос
/ 10 апреля 2010

Возможно, вы работаете над чем-то, хранящимся глубоко в стеке.

Держу пари, что если вы поместите это в верхнюю часть кода:

int my_main(int argc, char * argv[], char * envp[]);

int main(int argc, char * argv[], char * envp) {
    char ** a;
    char ** e;
    a = malloc(argc+1); // note: you should test the results for NULL
    e = malloc(1+count(envp) ) ;// I'm not writing code to count it, but it's easy

    int i = 0;
    while (argv[i++]) {
       a[i] = strdup(argv[i]);
    }
    a[i] = argv[i]; // argv[i] is NULL and already in a register

    // do the same thing for envp

    return my_main(argc, a, e);
}
#define main my_main

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

1 голос
/ 10 апреля 2010

Ситуация, когда он начал падать, была, когда я добавил функцию, которая много читает из файла, используя ifstream.Я открываю поток каждый раз, когда пытаюсь прочитать новый файл и закрываю его, когда заканчиваю читать.

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

0 голосов
/ 10 апреля 2010

Большое спасибо за вашу помощь, я точно не решил проблему, но мне удалось ее избежать. По сути, если я даже упомянул команду ifsteam (только в этой и той функции), программа потерпела крах.

На самом деле я зашел так далеко, что изменил функцию, просто объявив ifstream, а затем вернул 0. Я «исправил» его, объявив ifstream как указатели и обновив их. Если я удалил указатель, он снова вышел из строя, поэтому мне пришлось установить его на 0 (leeeeak).

Если бы кто-нибудь мог объяснить мне, почему это происходит, это было бы здорово. Хотя я просто счастлив, что теперь это работает, я бы лучше знал, почему ..

...