我们先上一段代码分析一下:
mydialog.h
classMyDialog :publicQDialog
{
public:
explicitMyDialog( QWidget* parent );
private:
QLabel* m_pText;
QPushButton* m_pExit;
QVBoxLayout* m_pMainLayout;
}
///
mydialog.cpp
MyDialog::MyDialog( QWidget* parent )
: QDialog( parent )
{
m_pText =newQLabel( tr("welcome to my dialog"));
m_pExit =newQPushButton( tr("Ok"));
m_pMainLayout =newQVBoxLayout;
m_pMainLayout.addWidget( m_pText );
m_pMainLayout.addWidget( m_pExt );
this->setLayout( m_pMainLayout );
}
main.cpp
int main( int argc, char** argv )
{
QApplication app( argc, argv );
MyDialog dlg;
dlg.show();
return app.exec();
}
上面这段代码代码大家看完什么反映?
。。。
你不是制造内存泄漏吗,你在构造函数函数中有3个地方申请了内存,可是没有一个地方去释放他们。
太对了,我刚开始也是这么想的,那么我们就去释放它吧,好加上我们自己的析构函数:
MyDialog::~MyDialog()
{
deletem_pText;
deletem_pExit;
deletem_pMainLayout;
}
好,我们就这样解决了我们的内存泄漏问题,大功告成。
但是如果我写这篇文章,就为了说这个,那未免太搞笑了吧,那个c++的程序员不知道这个。
新的发现是从一段程序崩溃中看到的。
main.cpp
intmain(intargc,char** argv )
{
QApplication app( argc, argv );
MyDialog *pDlg =newMyDialog;
QLabel* m_pText;
QPushButton* m_pExit;
QVBoxLayout* m_pMainLayout;
m_pText =newQLabel( tr("welcome to my dialog"));
m_pExit =newQPushButton( tr("Ok"));
m_pMainLayout =newQVBoxLayout;
m_pMainLayout.addWidget( m_pText );
m_pMainLayout.addWidget( m_pExt );
pDlg->setLayout( m_pMainLayout );
pDlg->show();
app.exec();
deletepDlg;
deletem_pText;
deletem_pExit;
deletem_pMainLayout;
return 0;
}
编译运行上面的代码,发现按 esc 推出的时候,程序崩溃了,崩溃在delete m_pText;
什么问题呢?
先不管,在换种方式:
deletem_pText;
deletem_pExit;
deletem_pMainLayout;
deletepDlg;
再编译运行,发现程序顺利退出了。
这又是什么原因呢?
原来在qt中当你删除父亲窗口时,其子窗口,子控件都会被删除,释放。所以刚才我们代码中delete pDlg,已经释放了
m_pText;
m_pExit;
m_pMainLayout;
对应的内存,后来我们再去删除,就崩溃了,后来我们换了种方式,就没有这个问题。
知道是这个原因后,我想我们当初的代码是不是就可以改一下了。
mydialog.h
classMyDialog :publicQDialog
{
public:
explicitMyDialog( QWidget* parent );
private:
}
///
mydialog.cpp
MyDialog::MyDialog( QWidget* parent )
: QDialog( parent )
{
QLabel* pText;
QPushButton* pExit;
QVBoxLayout* pMainLayout;
pText =newQLabel( tr("welcome to my dialog"),this);
pExit =newQPushButton( tr("Ok"),this);
pMainLayout =newQVBoxLayout;
pMainLayout.addWidget( pText );
pMainLayout.addWidget( pExt );
this->setLayout( pMainLayout );
}
main.cpp
int main( int argc, char** argv )
{
QApplication app( argc, argv );
MyDialog dlg;
dlg.show();
return app.exec();
}
一下子节省了不少步骤,不用我们去自己管理这些new的东西了。