歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

QT中的內存管理

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

  1. mydialog.h  
  2.   
  3. class MyDialog : public QDialog  
  4. {  
  5. public:  
  6.     explicit MyDialog( QWidget* parent );  
  7. private:  
  8.     QLabel* m_pText;  
  9.     QPushButton* m_pExit;  
  10.     QVBoxLayout* m_pMainLayout;  
  11.  }  
  12.   
  13. ///////////////////////////////////////////////////////////////////////////////////   
  14. mydialog.cpp  
  15.   
  16. MyDialog::MyDialog( QWidget* parent )  
  17. : QDialog( parent )  
  18. {  
  19.   <pre name="code" class="cpp">  m_pText = new QLabel( tr( "welcome to my dialog" ));  
  20.   m_pExit = new QPushButton( tr( "Ok" ));  
  21.   <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.   
  4. int main( int argc, char** argv )  
  5. {  
  6.   QApplication app( argc, argv );  
  7.   
  8.   MyDialog *pDlg = new MyDialog;  
  9. <pre name="code" class="cpp">  QLabel* m_pText;  
  10.   QPushButton* m_pExit;  
  11.   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.   
  3.   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.   
  3. class MyDialog : public QDialog  
  4. {  
  5. public:  
  6.     explicit MyDialog( QWidget* parent );  
  7. private:  
  8.   
  9.  }  
  10.   
  11. ///////////////////////////////////////////////////////////////////////////////////   
  12. mydialog.cpp  
  13.   
  14. MyDialog::MyDialog( QWidget* parent )  
  15. : QDialog( parent )  
  16. {  
  17.   <pre name="code" class="cpp">    QLabel* pText;  
  18.     QPushButton* pExit;  
  19.     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