一般情况下我们用C++编程的时候,如果用new来创建对象,用完后必须用delete把创建的对象删除,如果不删除就会导致内存泄漏。在QT界面设计中控件如果是new出来的不可避免要涉及到要delete的问题,但是如果我们把它删除了,会导致程序出现问题。
如下所示:
YTEP_UI_DevicePotAutoAddDlg::YTEP_UI_DevicePotAutoAddDlg(QWidget *parent) :
QDialog(parent),
ui(new Ui::YTEP_UI_DevicePotAutoAddDlg)
{
ui->setupUi(this);
ui->btn_sel_all->setMinimumSize(QSize(120,36));
ui->btn_cancel->setMinimumSize(QSize(120,36));
ui->btn_fristA->setMinimumSize(QSize(120,36));
ui->btn_nextB->setMinimumSize(QSize(120,36));
ui->btn_cancel_all->setMinimumSize(QSize(120,36));
ui->btn_ok->setMinimumSize(QSize(120,36));
m_pBtnsLayout = new QVBoxLayout;
m_pBtnsLayout->addSpacing(20);
m_pBtnsLayout->addWidget(ui->btn_sel_all);
m_pBtnsLayout->addWidget(ui->btn_cancel_all);
m_pBtnsLayout->addWidget(ui->btn_fristA);
m_pBtnsLayout->addWidget(ui->btn_nextB);
m_pBtnsLayout->addWidget(ui->btn_cancel);
m_pBtnsLayout->addWidget(ui->btn_ok);
m_pBtnsLayout->setSpacing(8);
m_pBtnsLayout->addSpacerItem(new QSpacerItem(20,20,QSizePolicy::Minimum,QSizePolicy::Expanding));
m_pContextLayout = new QHBoxLayout;
m_pContextLayout->addWidget(ui->tableWidget);
m_pContextLayout->addSpacing(10);
m_pContextLayout->addLayout(m_pBtnsLayout);
m_pContextLayout->setMargin(10);
m_pContextLayout->setStretch(0,1);
m_pFrameLayout = new QVBoxLayout;
m_pFrameLayout->addWidget(ui->lb_title);
m_pFrameLayout->addLayout(m_pContextLayout);
//m_pFrameLayout->setStretch(0,0);
setLayout(m_pFrameLayout);
InitControls();
}
YTEP_UI_DevicePotAutoAddDlg::~YTEP_UI_DevicePotAutoAddDlg()
{
delete m_pBtnsLayout;
delete m_pContextLayout;
delete m_pFrameLayout;
delete ui;
}
程序运行后会出现下面的问题:
图片中“the inferior stopped because it received a signal from…”,查找资料,说这个的原因是这个变量为空,也就说这个指针不存在,所以我们删除的时候就出错了。可以理解为,系统自动删除了,不需要我们手动删除。
后面查询相关QT文档,得出以下结论:
1、QT中new的时候指定父类的,不需要手动delete
2、QT中通过addLayout添加到布局控件中的布局或者控件不需要手动delete
3、QT中通过setLayout添加到控件中的如果setLayout的对象没有添加到其他布局直接显示、或者没有指定父类的,这个需要手动delete
欢迎指正!