我們先上一段代碼分析一下:
- 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();
}
一下子節省了不少步驟,不用我們去自己管理這些new的東西了。