Qt / C ++ Exited с кодом -1073741819 (программа аварийно завершает работу с кодом исключения c0000005) - PullRequest
1 голос
/ 10 ноября 2010

У меня проблемы с падением моей программы. Я получаю, что всплывающее окно «Program.exe перестало работать», в котором упоминается мой код исключения c0000005. Когда я возвращаюсь к выводу из приложения в Qt, он показывает:

C:\Users\Me\Desktop\project\project-build-desktop\debug\project.exe exited with code -1073741819

Я нашел строку, которая вызывает ошибку (я думаю!), Хотя я не знаю, почему это может произойти. Если я закомментирую эту строку, программа не будет аварийно завершена.

Строка:

db=newDb;

Это находится в конструкторе моего класса wndChildWhatever, который является QMainWindow. newDb определен в аргументах конструктора как DatabaseManager *newDb, а db является закрытым членом wndChild, определенным как DatabaseManager *db. Этот адрес базы данных передается по всей моей программе, и этот wndChildWhatever - единственный, с которым у меня проблемы.

Однако, исключение / сбой не происходит при открытии / создании окна. Это происходит, когда окно закрыто. Что более странно, так это то, что это происходит не каждый раз. Иногда вы можете открыть окно и закрыть его без проблем, затем открыть его снова, и при втором закрытии, он падает. В других случаях это происходит при первой попытке закрыть его.

Я действительно не уверен, что здесь происходит, и надеюсь, что кто-то может помочь!

Ответы [ 4 ]

2 голосов
/ 10 ноября 2010

Строка неисправности:

db=newDb;

А вы говорите:

и db является частным членом wndChild

Похоже, ваш указатель this может быть недействительным. То есть, если это происходит в методе foo, вы делаете что-то вроде wndChild->foo(), а wndChild является неверным указателем. Поэтому, когда он получает доступ к смещению db относительно wndChild, вы попадаете в нарушение доступа. (Код ошибки NT 0xc0000005, Windows говорит о плохом разыменовании указателя.)

0 голосов
/ 12 октября 2013

Попробуйте удалить каталог сборки и перестроить его.Это сработало для меня, но мне нужно делать это каждый раз, когда я добавляю новую функцию или член в любой класс.ИДК почему.

0 голосов
/ 10 ноября 2010

С помощью строки db = newDb у вас есть два указателя на один и тот же объект.Что ты делаешь в деструкторах?Если у вас есть «delete db» и «delete newDb», вы удаляете один и тот же объект дважды, что может привести к сбою или нет.

0 голосов
/ 10 ноября 2010

Скорее всего, сбой вызывает не сама строка db = newDb, а какой-то другой код, который выполняется позже, который не будет выполнен, если вы не установите значение db.Посмотрите на другой код внутри вашего класса wndChildWh независимо от того, что он делает со значением (db).Возможно, он делает что-то непослушное, например, удаляет его, пока другой код все еще использует это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...