2017-02-21 9 views
0

Я использую объект в наследуется QWidget, и для того, чтобы знать, когда он закрыт, я использовал setAttribute(Qt::WA_DeleteOnClose) и соединялиУдаление объекта, который наследует от QWidget, WA_DeleteOnClose ошибки сегментации

connect(myObj,SIGNAL(destroyed(QObject*)),this,SLOT(handleFinish())); 

Однако, когда объект удаляется, я получаю munmap_chunk(): invalid pointer, и когда я смотрю адрес указателя, это один из элементов данных myObj, который на самом деле не является указателем.

выделяет myObj динамически, поэтому он должен быть в куче - myObj = new myObj(); ошибка приходит в конце myObj деструктора, и я проверил, что это первый раз, когда вызывается деструктор (после просмотра When setting the WA_DeleteOnClose attribute on a Qt MainWindow, the program crashes when deleting the ui pointer).

Любые предложения по работе с ним?

+0

Выполняется ли вызов 'handleFinish()'? Вы развращаете свою память. Я думаю, что этот вопрос невозможен, если вы не предоставите [MCVE] (https://stackoverflow.com/help/mcve). Попробуйте изолировать проблему, временно удалив инструкции из деструктора и/или удаляйте данные элемента (которые разрушаются при уничтожении объекта), и наблюдайте за переменной statement/member, которая приводит к тому, что авария не возникает, когда она закомментирована. – Mike

ответ

1

К моменту получения сигнала destroyed объект является только QObject - не QWidget и определенно не имеет никакого производного типа. Вы можете получить доступ только к членам и методам, предоставленным через QObject, а не через какой-либо другой тип.

Похоже, вы хотите получать уведомления о закрытии виджета: для этого установите фильтр событий, который перехватывает QEvent::close в виджетах. См. Также this answer и a discussion of why a closeEvent cannot be generally handled via a slot.

+0

Спасибо, похоже, что мне нужно. – JLev