Я получаю исключение, если оставляю программу на некоторое время работающей - PullRequest
0 голосов
/ 20 декабря 2009
  • Платформа: Win32
  • Язык: C ++

Я получаю сообщение об ошибке, если оставляю программу на некоторое время (~ 10 минут).

Необработанное исключение в 0x10003fe2 в ImportTest.exe: 0xC0000005: Место чтения нарушения прав доступа 0x003b1000.

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

Я также не могу ' free () ' памяти, потому что это всегда вызывает (возможно, я не должен использовать free () для переменных):

Необработанное исключение в 0x76e81f70 в ImportTest.exe: 0xC0000005: Место чтения нарушения прав доступа 0x0fffffff.

на этом этапе программа ничего не делает и просто ждет ввода пользователя

dllHandle = LoadLibrary(L"miniFMOD.dll");

playSongPtr = (playSongT)GetProcAddress(dllHandle,"SongPlay");
loadSongPtr = (loadSongT)GetProcAddress(dllHandle,"SongLoadFromFile");

int songHandle = loadSongPtr("FILE_PATH");

// ... {just output , couldn't cause errors}

playSongPtr(songHandle);
getch(); // that is where it causes an error if i leave it running for a while

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

playSongPtr ();

вызывает проблему. но я не знаю как это исправить

Ответы [ 3 ]

1 голос
/ 20 декабря 2009

Я думаю, довольно ясно, что в вашей программе есть ошибка. Если вы не знаете, с чего начать, полезной техникой является «разделяй и властвуй».

Начните с вашей программы в состоянии, когда вы можете вызвать исключение. Удалите половину кода и попробуйте снова. Если исключение по-прежнему происходит, то у вас есть вдвое меньше кода для просмотра. Если исключение не происходит, возможно, оно связано с только что удаленным кодом.

Повторяйте вышеупомянутое, пока вы не изолируете проблему.

Обновление : Вы говорите "на этом этапе программа ничего не делает", но ясно, что что-то делает (иначе это не приведет к сбою). Является ли ваша программа программой консольного режима? Если да, то какую функцию вы используете для ожидания ввода пользователя? Если нет, то это программа с графическим интерфейсом? Вы открыли диалоговое окно и ждете, чтобы что-то произошло? Есть ли у вас запущенные таймеры Windows? Любые темы?

Обновление 2 : в свете небольшого фрагмента кода, который вы опубликовали, я уверен, что если вы попытаетесь удалить вызов функции playSongPtr(songHandle), ваша проблема, скорее всего, исчезнет далеко. Вам нужно будет выяснить, какие требования предъявляются к "miniFMOD.dll". Например, эта DLL может предполагать, что она работает в среде с графическим интерфейсом вместо консольной программы, и может выполнять действия, которые не обязательно работают в режиме консоли. Кроме того, чтобы сделать что-либо в фоновом режиме (включая воспроизведение песни), этой DLL, вероятно, необходимо создать поток, чтобы периодически загружать следующий бит песни и ставить его в очередь в буфере воспроизведения. Вы можете проверить количество потоков, создаваемых вашей программой, в диспетчере задач (или, лучше, в Process Explorer). Если их больше одного, то происходят другие вещи, которые вы не контролируете напрямую.

1 голос
/ 20 декабря 2009

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

Первым шагом будет проверка вашего кода на NULL проверка ссылок, т.е. убедитесь, что у вас есть действительный указатель перед его использованием, и проверка жизненного цикла всех выделенных и освобожденных ресурсов. Запись NULL по ссылкам, которые вы только что освободили, может помочь найти проблемное место.

0 голосов
/ 20 декабря 2009

Я сомневаюсь, что эта конкретная проблема - утечка памяти; проблема заключается в разыменовании указателя, который не указывает на что-то полезное. Чтобы проверить утечку памяти, просмотрите свой процесс в инструменте списка процессов операционной системы (диспетчер задач, ps и т. Д.) И посмотрите, продолжает ли расти значение «используемой памяти».

При вызове free: Вы должны вызывать free () один раз и только один раз для ненулевых значений, возвращаемых malloc (), calloc () или strdup (). Вызов free () менее одного раза приведет к утечке памяти. Повторный вызов free () приведет к повреждению памяти.

Вы должны получить трассировку стека, чтобы увидеть, что происходит, когда происходит сбой процесса. Основываясь на моем чтении соответствующих адресов, вы, вероятно, переполнили стек или неправильно вычислили указатель, используя адрес стека (в терминах C / C ++: переменная «auto»). Трассировка стека покажет вам, как вы добрались до точки где он разбился.

...