歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> QT中的內存管理

QT中的內存管理

日期:2017/3/1 11:02:11   编辑:Linux編程

我們先上一段代碼分析一下:

  1. mydialog.h
  2. class MyDialog : public QDialog
  3. {
  4. public:
  5. explicit MyDialog( QWidget* parent );
  6. private:
  7. QLabel* m_pText;
  8. QPushButton* m_pExit;
  9. QVBoxLayout* m_pMainLayout;
  10. }
  11. ///////////////////////////////////////////////////////////////////////////////////
  12. mydialog.cpp
  13. MyDialog::MyDialog( QWidget* parent )
  14. : QDialog( parent )
  15. {
  16. <pre name="code" class="cpp"> m_pText = new QLabel( tr( "welcome to my dialog" ));
  17. m_pExit = new QPushButton( tr( "Ok" ));
  18. <pre name="code" class="cpp"> m_pMainLayout = new QVBoxLayout;
  1. m_pMainLayout.addWidget( m_pText );
  2. m_pMainLayout.addWidget( m_pExt );
  3. this->setLayout( m_pMainLayout );

}


////////////////////////////////////////////////////////////////////////////////////
main.cpp

int main( int argc, char** argv )
{
QApplication app( argc, argv );
MyDialog dlg;
dlg.show();
return app.exec();
}

上面這段代碼代碼大家看完什麼反映?

。。。


你不是制造內存洩漏嗎,你在構造函數函數中有3個地方申請了內存,可是沒有一個地方去釋放他們。


太對了,我剛開始也是這麼想的,那麼我們就去釋放它吧,好加上我們自己的析構函數:

  1. MyDialog::~MyDialog()
  2. {
  3. delete m_pText;
  4. delete m_pExit;
  5. delete m_pMainLayout;
  6. }

好,我們就這樣解決了我們的內存洩漏問題,大功告成。


但是如果我寫這篇文章,就為了說這個,那未免太搞笑了吧,那個c++的程序員不知道這個。


新的發現是從一段程序崩潰中看到的。

  1. ////////////////////////////////////////////////////////////////////////////////////
  2. main.cpp
  3. int main( int argc, char** argv )
  4. {
  5. QApplication app( argc, argv );
  6. MyDialog *pDlg = new MyDialog;
  7. <pre name="code" class="cpp"> QLabel* m_pText;
  8. QPushButton* m_pExit;
  9. QVBoxLayout* m_pMainLayout;
  1. <pre name="code" class="cpp"> m_pText = new QLabel( tr( "welcome to my dialog" ));
  2. m_pExit = new QPushButton( tr( "Ok" ));
  3. <pre name="code" class="cpp"> m_pMainLayout = new QVBoxLayout;
  1. m_pMainLayout.addWidget( m_pText );
  2. m_pMainLayout.addWidget( m_pExt );
  3. <pre name="code" class="cpp"> pDlg->setLayout( m_pMainLayout );

  pDlg->show();

  1. app.exec();
  2. delete pDlg;
  1. delete m_pText;
  2. delete m_pExit;
  3. delete m_pMainLayout;

return 0;
}

編譯運行上面的代碼,發現按 esc 推出的時候,程序崩潰了,崩潰在delete m_pText; 

什麼問題呢?


先不管,在換種方式:

  1. <pre name="code" class="cpp">
  1. delete m_pText;
  2. delete m_pExit;
  3. delete m_pMainLayout;
  4. <pre name="code" class="cpp"><pre name="code" class="cpp"> delete pDlg;




再編譯運行,發現程序順利退出了。


這又是什麼原因呢?


原來在qt中當你刪除父親窗口時,其子窗口,子控件都會被刪除,釋放。所以剛才我們代碼中delete pDlg,已經釋放了

  1. <pre name="code" class="cpp">m_pText;
  2. m_pExit;
  3. m_pMainLayout;

對應的內存,後來我們再去刪除,就崩潰了,後來我們換了種方式,就沒有這個問題。 


知道是這個原因後,我想我們當初的代碼是不是就可以改一下了。

  1. mydialog.h
  2. class MyDialog : public QDialog
  3. {
  4. public:
  5. explicit MyDialog( QWidget* parent );
  6. private:
  7. }
  8. ///////////////////////////////////////////////////////////////////////////////////
  9. mydialog.cpp
  10. MyDialog::MyDialog( QWidget* parent )
  11. : QDialog( parent )
  12. {
  13. <pre name="code" class="cpp"> QLabel* pText;
  14. QPushButton* pExit;
  15. QVBoxLayout* pMainLayout;
  1. pText = new QLabel( tr( "welcome to my dialog" ), this );
  2. pExit = new QPushButton( tr( "Ok" ), this );
  3. <pre name="code" class="cpp"> pMainLayout = new QVBoxLayout;
  1. pMainLayout.addWidget( pText );
  2. pMainLayout.addWidget( pExt );
  3. this->setLayout( pMainLayout );

}


////////////////////////////////////////////////////////////////////////////////////
main.cpp

int main( int argc, char** argv )
{
QApplication app( argc, argv );
MyDialog dlg;
dlg.show();
return app.exec();
}

一下子節省了不少步驟,不用我們去自己管理這些new的東西了。

Copyright © Linux教程網 All Rights Reserved