Qt中关于delete的应用
文章目錄
- 前言
- Qt半自動(dòng)的內(nèi)存管理
- 父子關(guān)系
- 建立與解除
- 獲取父、子對(duì)象
- 關(guān)于delete的示例程序
- 參考和引用
前言
這學(xué)期開(kāi)了專業(yè)課Qt,第一次接觸到C++,在C++中學(xué)習(xí)過(guò)程中,我們都知道:
delete 和 new 必須 配對(duì)使用(一 一對(duì)應(yīng)):delete少了,則內(nèi)存泄露,多了麻煩更大。
Qt作為C++的庫(kù),顯然是不會(huì)違背C++的前述原則的。可是:
在Qt中,我們很多時(shí)候都瘋狂地用new,卻很少用delete,缺少的 delete 去哪兒了?!
本文整理了C++中關(guān)于delete和new的知識(shí)點(diǎn)。
Qt半自動(dòng)的內(nèi)存管理
在Qt中,以下情況下你new出的對(duì)象你可以不用 親自去delete (但你應(yīng)該清楚delete在何處被Qt調(diào)用的,怎么被調(diào)用的):
QObject及其派生類的對(duì)象,如果其parent非0,那么其parent析構(gòu)時(shí)會(huì)析構(gòu)該對(duì)象(本文內(nèi)容圍繞這一點(diǎn)展開(kāi) )
除此之外,有些類的對(duì)象可以接收設(shè)置一些特別的標(biāo)記,比如:
QWidget及其派生類的對(duì)象,可以設(shè)置 Qt::WA_DeleteOnClose 標(biāo)志位(當(dāng)close時(shí)會(huì)析構(gòu)該對(duì)象)
QAbstractAnimation派生類的對(duì)象,可以設(shè)置 QAbstractAnimation::DeleteWhenStopped
QRunnable::setAutoDelete()
MediaSource::setAutoDelete()
…
注意:這些用法會(huì)有些陷阱 ,請(qǐng)注意看本文最后的3個(gè)小例子。
在Qt中,最基礎(chǔ)和核心的類是:QObject 。它的魔力很大,本文只關(guān)注兩點(diǎn):
父子關(guān)系
在Qt中,每個(gè) QObject 內(nèi)部都有一個(gè)list,用來(lái)保存所有的 children,還有一個(gè)指針,保存自己的parent。當(dāng)它自己析構(gòu)時(shí),它會(huì)將自己從parent的列表中刪除,并且析構(gòu)掉所有的children。
注意:在 Qt 中,我們經(jīng)常會(huì)遇到
建立與解除
Q_INVOKABLE QObject::QObject ( QObject * parent = 0 )
創(chuàng)建一個(gè)QObject對(duì)象時(shí),如果指定了父對(duì)象,它就會(huì)將自己添加到父對(duì)象的 children 列表中
QObject::~QObject () [virtual]
當(dāng)一個(gè)QObject對(duì)象析構(gòu)時(shí),它會(huì)將自己從父對(duì)象的 children 列表中移除(parent非0的話)
void QObject::setParent ( QObject * parent )
通過(guò)該函數(shù),將自己從原父對(duì)象的children中刪除,添加到新parent的children列表中
注:這三個(gè)函數(shù)都是通過(guò)一個(gè)內(nèi)部私有函數(shù)來(lái)實(shí)現(xiàn)的,這就是
QObjectPrivate::setParent_helper(QObject *o)
獲取父、子對(duì)象
每個(gè)QObject只有一個(gè)父對(duì)象:
QObject * QObject::parent () const
子對(duì)象可以有多個(gè)
const QObjectList & QObject::children () const
所以可以根據(jù)條件來(lái)查找嘍:
T QObject::findChild ( const QString & name = QString() ) const
QList QObject::findChildren ( const QString & name = QString() ) const
關(guān)于delete的示例程序
----使用標(biāo)志位可以不顯示的使用delete,但和使用delete是一樣的。因?yàn)镼t在暗中
使用了delete。
----下面是一個(gè)暗中使用delete的例子。這是一個(gè)類,它有一個(gè)成員函數(shù),可以刪除
自己。當(dāng)然只能刪除由關(guān)鍵字new創(chuàng)建的自己。
參考和引用
總結(jié)
以上是生活随笔為你收集整理的Qt中关于delete的应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ipsec vpi_VPI的完整形式是什
- 下一篇: 服务器显示已登陆的用户太多,服务器远程连