我们先上一段代码分析一下:
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.cppint 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.cppint main( int argc, char** argv )
{
QApplication app( argc, argv );
MyDialog dlg;
dlg.show();
return app.exec();
}一下子节省了不少步骤,不用我们去自己管理这些new的东西了。
版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.
More from my site