QT中的内存管理

Linux大全评论1.9K views阅读模式

我们先上一段代码分析一下:

  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();

}


企鹅博客
  • 本文由 发表于 2019年7月16日 12:04:07
  • 转载请务必保留本文链接:https://www.qieseo.com/172533.html

发表评论