QT中的内存管理

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

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 )
{
  
  m_pText = new QLabel( tr( "welcome to my dialog" ));
  m_pExit = new QPushButton( tr( "Ok" ));
  
  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;
  QLabel* m_pText;
  QPushButton* m_pExit;
  QVBoxLayout* m_pMainLayout;
  m_pText = new QLabel( tr( "welcome to my dialog" ));
  m_pExit = new QPushButton( tr( "Ok" ));
  
  m_pMainLayout = new QVBoxLayout; 
  m_pMainLayout.addWidget( m_pText );
  m_pMainLayout.addWidget( m_pExt );
  
  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;

什么问题呢?

先不管,在换种方式:


  delete m_pText;
  delete m_pExit;
  delete m_pMainLayout;
  delete pDlg;



再编译运行,发现程序顺利退出了。

这又是什么原因呢?

原来在qt中当你删除父亲窗口时,其子窗口,子控件都会被删除,释放。所以刚才我们代码中delete pDlg,已经释放了

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 )
{
  
    QLabel* pText;
    QPushButton* pExit;
    QVBoxLayout* pMainLayout;
    pText = new QLabel( tr( "welcome to my dialog" ), this );
    pExit = new QPushButton( tr( "Ok" ), this );
  
    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的东西了。

版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.

    分享到:

Leave a Reply

Your email address will not be published. Required fields are marked *