2016-03-18 2 views
0

Когда я закрываю родительский элемент qdialog_search (главный указатель), qdebugger обнаруживает ошибку segm в деструкторе qdialog_search. qdialog_search - это производная форма QDialog (и, возможно, это проблема). это код:Ошибка сегментации в деструкторе Qt QDialog

//.h 
#ifndef QDIALOG_SEARCH_H 
#define QDIALOG_SEARCH_H 
#include <QDialog> 
#include <QVBoxLayout> 
#include <QTabWidget> 
#include <QDebug> 
#include <QLineEdit> 
#include <QPushButton> 
#include <QLabel> 
class QDialog_search: public QDialog{ 
private: 
QVBoxLayout* main; 
QTabWidget* tab; 
// id 
QWidget* search_id; 
QVBoxLayout* id_l; 
QLineEdit* id_line; 
QPushButton* id_button; 
// owner 
QWidget* search_owner; 
QVBoxLayout* ow_l; 
QLineEdit* ow_line; 
QPushButton* ow_button; 
// destination 
QWidget* search_dest; 
QVBoxLayout* dest_l; 
QLineEdit* dest_line; 
QPushButton* dest_button; 
public: 
QDialog_search(QWidget* parent=0); 
void buildSearchId(); 
void buildSearchOwner(); 
void buildSearchDest(); 
~QDialog_search(); 

}; 

#endif // QDIALOG_SEARCH_H 

//.cpp 
      QDialog_search::QDialog_search(QWidget *parent):QDialog(parent), 
main(new QVBoxLayout()), 
tab(new QTabWidget()), 
id_l(new QVBoxLayout()), 
search_dest(new  QWidget(tab)),search_id(new QWidget(tab)) 
,search_owner(new QWidget(tab)),ow_l(new QVBoxLayout()), 
dest_l(new QVBoxLayout()){ 
setLayout(main); 
setWindowTitle("SEARCH"); 
setWindowIcon(QIcon(":/icon/icone/search.png")); 
setMinimumSize(200,200); 
main->addWidget(tab); 
tab->addTab(search_id,"ID"); 
tab->addTab(search_dest,"destination"); 
tab->addTab(search_owner,"owner"); 
buildSearchId(); 
buildSearchDest(); 
buildSearchOwner(); 
} 

void QDialog_search::buildSearchId(){ 
search_id->setLayout(id_l); 
QLabel* id_lab=new QLabel("Search ID",search_id); 
id_lab->setMaximumSize(60,30); 
id_l->addWidget(id_lab); 
id_line=new QLineEdit(search_id);id_line->setMaximumSize(120,30); 
id_l->addWidget(id_line); 
id_button=new QPushButton(search_id);id_button->setMaximumSize(120,30); 
id_button->setIcon(QIcon(":/icon/icone/search.png")); 
id_l->addWidget(id_button); 
} 

void QDialog_search::buildSearchOwner(){ 
search_owner->setLayout(ow_l); 
QLabel* ow_lab=new QLabel("Search owner",search_owner); 
ow_lab->setMaximumSize(90,30); 
ow_l->addWidget(ow_lab); 
ow_line=new QLineEdit(search_owner);ow_line->setMaximumSize(120,30); 
ow_l->addWidget(ow_line); 
ow_button=new QPushButton(search_owner);ow_button->setMaximumSize(120,30); 
ow_button->setIcon(QIcon(":/icon/icone/search.png")); 
ow_l->addWidget(ow_button); 
} 

void QDialog_search::buildSearchDest(){ 
search_dest->setLayout(dest_l); 
QLabel* dest_lab=new QLabel("Search destination",search_dest); 
dest_lab->setMaximumSize(120,30); 
dest_l->addWidget(dest_lab); 
dest_line=new QLineEdit(search_dest);dest_line->setMaximumSize(120,30); 
dest_l->addWidget(dest_line); 
dest_button=new QPushButton(search_dest); 
dest_button->setMaximumSize(120,30); 
dest_button->setIcon(QIcon(":/icon/icone/search.png")); 
dest_l->addWidget(dest_button); 
} 

QDialog_search::~QDialog_search(){ 
delete main; 
delete tab; 
delete search_id; // debugger say this is segm fault, search_id is //QWidget* 
delete id_l; 
delete id_line; 
delete id_button; 
delete search_owner; 
delete ow_l; 
delete ow_line; 
delete ow_button; 
delete search_dest; 
delete dest_l; 
delete dest_line; 
delete dest_button; 
} 

Я попытался удалить «удалить SEARCH_ID», но отладчик доказательств в SEGM неисправность в конце ~ QDialog_search(). Иногда возникает проблема segm, когда я создаю QDialog_search, но только иногда.

+0

Этот код является небольшой частью проекта. Если бы мне пришлось сделать пример, я должен включить mainwindow с функциональностью, использующей этот код. Этот код вызывается, когда я нажимаю кнопку в главном окне (родительский). Когда я закрываю mainWindow (да mainwindow, а не QDialog_search), обнаруживается segmentationf fault. – CodeBott

+0

Извините за высказывание, что вам нужен MCVE, вы действительно предоставили его. Надеюсь, мой ответ поможет. – nwp

ответ

2

Ошибка связана с несогласием в том, как вы и Qt обрабатываете память. search_id - ребенок tab, так как вы установили tab в качестве родителя в search_id(new QWidget(tab)). По мнению Qt, родитель несет ответственность за delete ребенка. В деструкторе вы delete tab;, который, следовательно, также delete s его ребенок search_id. Тогда вы delete search_id, но его больше не существует, поэтому вы получаете ошибку сегментации.

Я рекомендую вам прочитать Qt's Object Trees & Ownership, чтобы лучше понять модель собственности и избежать этого типа ошибки в будущем.

+0

Либо это, либо будьте осторожны, в каком порядке вы удаляете материал. : 3 Но все же использование «родительской» вещи Qt намного проще. – rbaleksandar

+0

И вкладка является ребенком основного. Ты прав! Спасибо nwp – CodeBott

+0

Я исправлю это, снова спасибо – CodeBott

Смежные вопросы