linux qt 内存,QT中的内存管理

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

mydialog.h

classMyDialog :publicQDialog

{

public:

explicitMyDialog( QWidget* parent );

private:

QLabel* m_pText;

QPushButton* m_pExit;

QVBoxLayout* m_pMainLayout;

}

///

mydialog.cpp

MyDialog::MyDialog( QWidget* parent )

: QDialog( parent )

{

  m_pText =newQLabel( tr("welcome to my dialog"));

m_pExit =newQPushButton( tr("Ok"));

  m_pMainLayout =newQVBoxLayout;

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

{

deletem_pText;

deletem_pExit;

deletem_pMainLayout;

}

好,我们就这样解决了我们的内存泄漏问题,大功告成。

但是如果我写这篇文章,就为了说这个,那未免太搞笑了吧,那个c++的程序员不知道这个。

新的发现是从一段程序崩溃中看到的。

main.cpp

intmain(intargc,char** argv )

{

QApplication app( argc, argv );

MyDialog *pDlg =newMyDialog;

  QLabel* m_pText;

QPushButton* m_pExit;

QVBoxLayout* m_pMainLayout;

  m_pText =newQLabel( tr("welcome to my dialog"));

m_pExit =newQPushButton( tr("Ok"));

  m_pMainLayout =newQVBoxLayout;

m_pMainLayout.addWidget( m_pText );

m_pMainLayout.addWidget( m_pExt );

  pDlg->setLayout( m_pMainLayout );

pDlg->show();

app.exec();

deletepDlg;

deletem_pText;

deletem_pExit;

deletem_pMainLayout;

return 0;

}

编译运行上面的代码,发现按 esc 推出的时候,程序崩溃了,崩溃在delete m_pText;

什么问题呢?

先不管,在换种方式:

 
 

deletem_pText;

deletem_pExit;

deletem_pMainLayout;

 
 
deletepDlg;

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

这又是什么原因呢?

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

m_pText;

m_pExit;

m_pMainLayout;

对应的内存,后来我们再去删除,就崩溃了,后来我们换了种方式,就没有这个问题。

知道是这个原因后,我想我们当初的代码是不是就可以改一下了。

mydialog.h

classMyDialog :publicQDialog

{

public:

explicitMyDialog( QWidget* parent );

private:

}

///

mydialog.cpp

MyDialog::MyDialog( QWidget* parent )

: QDialog( parent )

{

    QLabel* pText;

QPushButton* pExit;

QVBoxLayout* pMainLayout;

pText =newQLabel( tr("welcome to my dialog"),this);

pExit =newQPushButton( tr("Ok"),this);

    pMainLayout =newQVBoxLayout;

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的东西了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值