我们先上一段代码分析一下:
- mydialog.h
- class MyDialog : public QDialog
- {
- public:
- explicit MyDialog( QWidget* parent );
- private:
- QLabel* m_pText;
- QPushButton* m_pExit;
- QVBoxLayout* m_pMainLayout;
- }
- ///////////////////////////////////////////////////////////////////////////////////
- mydialog.cpp
- MyDialog::MyDialog( QWidget* parent )
- : QDialog( parent )
- {
- <pre name="code" class="cpp"> m_pText = new QLabel( tr( "welcome to my dialog" ));
- m_pExit = new QPushButton( tr( "Ok" ));
- <pre name="code" class="cpp"> m_pMainLayout = new QVBoxLayout;
- 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()
- {
- delete m_pText;
- delete m_pExit;
- delete m_pMainLayout;
- }
好,我们就这样解决了我们的内存泄漏问题,大功告成。
但是如果我写这篇文章,就为了说这个,那未免太搞笑了吧,那个c++的程序员不知道这个。
新的发现是从一段程序崩溃中看到的。
- ////////////////////////////////////////////////////////////////////////////////////
- main.cpp
- int main( int argc, char** argv )
- {
- QApplication app( argc, argv );
- MyDialog *pDlg = new MyDialog;
- <pre name="code" class="cpp"> QLabel* m_pText;
- QPushButton* m_pExit;
- QVBoxLayout* m_pMainLayout;
- <pre name="code" class="cpp"> m_pText = new QLabel( tr( "welcome to my dialog" ));
- m_pExit = new QPushButton( tr( "Ok" ));
- <pre name="code" class="cpp"> m_pMainLayout = new QVBoxLayout;
- m_pMainLayout.addWidget( m_pText );
- m_pMainLayout.addWidget( m_pExt );
- <pre name="code" class="cpp"> pDlg->setLayout( m_pMainLayout );
pDlg->show();
- app.exec();
- delete pDlg;
- delete m_pText;
- delete m_pExit;
- delete m_pMainLayout;
return 0;
}
编译运行上面的代码,发现按 esc 推出的时候,程序崩溃了,崩溃在delete m_pText;
什么问题呢?
先不管,在换种方式:
- <pre name="code" class="cpp">
- delete m_pText;
- delete m_pExit;
- delete m_pMainLayout;
- <pre name="code" class="cpp"><pre name="code" class="cpp"> delete pDlg;
再编译运行,发现程序顺利退出了。
这又是什么原因呢?
原来在qt中当你删除父亲窗口时,其子窗口,子控件都会被删除,释放。所以刚才我们代码中delete pDlg,已经释放了
- <pre name="code" class="cpp">m_pText;
- m_pExit;
- m_pMainLayout;
对应的内存,后来我们再去删除,就崩溃了,后来我们换了种方式,就没有这个问题。
知道是这个原因后,我想我们当初的代码是不是就可以改一下了。
- mydialog.h
- class MyDialog : public QDialog
- {
- public:
- explicit MyDialog( QWidget* parent );
- private:
- }
- ///////////////////////////////////////////////////////////////////////////////////
- mydialog.cpp
- MyDialog::MyDialog( QWidget* parent )
- : QDialog( parent )
- {
- <pre name="code" class="cpp"> QLabel* pText;
- QPushButton* pExit;
- QVBoxLayout* pMainLayout;
- pText = new QLabel( tr( "welcome to my dialog" ), this );
- pExit = new QPushButton( tr( "Ok" ), this );
- <pre name="code" class="cpp"> pMainLayout = new QVBoxLayout;
- 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();
}