日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt中关于delete的应用

發布時間:2024/1/1 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 。它的魔力很大,本文只關注兩點:

  • 父子關系
  • deleteLater
  • 父子關系

    在Qt中,每個 QObject 內部都有一個list,用來保存所有的 children,還有一個指針,保存自己的parent。當它自己析構時,它會將自己從parent的列表中刪除,并且析構掉所有的children。

    注意:在 Qt 中,我們經常會遇到

  • 基類、派生類,或父類、子類。 這是對于派生體系來說的,和在C++相關書中看到的完全一樣,與這的parent無關
  • 父對象、子對象、父子關系。 這是Qt中所特有的,也就是這兒的parent所引入的,與類的繼承關系無關
  • 建立與解除

    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)和依靠父對象
  • #include "mainwindow.h" #include <QApplication> #include <QtWidgets>int main(int argc, char *argv[]) {QApplication a(argc, argv);QWidget * widget = new QWidget();widget->setWindowTitle(QObject::tr("我是widget"));QLabel * label = new QLabel();label->setWindowTitle(QObject::tr("我是label"));label->setText(QObject::tr("我是個窗口"));label->resize(180,20);QLabel * label2 = new QLabel(widget);label2->setText(QObject::tr("我不是獨立窗口,只是widget的子部件"));label2->resize(250,20);label->show();widget->show();int ret = a.exec();delete label; // 釋放內存,因為label沒有父對象,所以它的釋放只能自己來。delete widget; // label2有父對象,它依靠父對象釋放,不用再單獨對其釋放return ret; }
  • 使用標志位
    ----使用標志位可以不顯示的使用delete,但和使用delete是一樣的。因為Qt在暗中
    使用了delete。
  • #include <QApplication> #include <QLabel>int main(int argc, char *argv[]) {QApplication app(argc, argv);QLabel *label = new QLabel;label->setAttribute(Qt::WA_DeleteOnClose);label->setText("first line\nsecond line");label->show();return app.exec(); }

    ----下面是一個暗中使用delete的例子。這是一個類,它有一個成員函數,可以刪除
    自己。當然只能刪除由關鍵字new創建的自己。

    #include<iostream> using namespace std;//類AAA class AAA { public://構造函數AAA();~AAA(void);void delete_me(void); };//構造函數 AAA::AAA(void) {//空的 }//析構函數 AAA::~AAA(void) {//空的 }//刪除自己 void AAA::delete_me(void) {delete this; }//主函數 int main(void) {AAA *a = new AAA;cout<<"point a will be deleted by himself."<<endl;a->delete_me();cout<<"point a has been deleted."<<endl;return 0; }

    參考和引用

  • https://blog.csdn.net/zanilia123/article/details/54598697
  • https://www.cnblogs.com/liushui-sky/p/5851936.html#t4
  • 總結

    以上是生活随笔為你收集整理的Qt中关于delete的应用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。