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