成人sese/国产免费人成视频在线观看/九色 在线/免费观看又色又爽又黄的/啪在线视频/日日做日日摸夜夜爽

首頁 資訊 > 創新 > 正文

Qt淺談之一:內存泄露

Qt內存管理機制:Qt 在內部能夠維護對象的層次結構。對于可視元素,這種層次結構就是子組件與父組件的關系;對于非可視元素,則是一個對象與另一個對象的從屬關系。在 Qt 中,在 Qt 中,刪除父對象會將其子對象一起刪除。

C++中delete 和 new 必須配對使用(一 一對應):delete少了,則內存泄露,多了麻煩更大。Qt中使用了new卻很少delete,因為QObject的類及其繼承的類,設置了parent(也可在構造時使用setParent函數或parent的addChild)故parent被delete時,這個parent的相關所有child都會自動delete,不用用戶手動處理。但parent是不區分它的child是new出來的還是在棧上分配的。這體現delete的強大,可以釋放掉任何的對象,而delete棧上對象就會導致內存出錯,這需要了解Qt的半自動的內存管理。另一個問題:child不知道它自己是否被delete掉了,故可能會出現野指針。那就要了解Qt的智能指針QPointer。


(相關資料圖)

二、關聯圖

(1)Linux內存圖,主要了解堆棧上分配內存的不同方式。

(2)在Qt中,最基礎和核心的類是:QObject,QObject內部有一個list,會保存children,還有一個指針保存parent,當自己析構時,會自己從parent列表中刪除并且析構所有的children。

三、詳解

1、Qt的半自動化的內存管理

(1)QObject及其派生類的對象,如果其parent非0,那么其parent析構時會析構該對象。

(2)QWidget及其派生類的對象,可以設置 Qt::WA_DeleteOnClose 標志位(當close時會析構該對象)。

(3)QAbstractAnimation派生類的對象,可以設置 QAbstractAnimation::DeleteWhenStopped。

(4)QRunnable::setAutoDelete()、MediaSource::setAutoDelete()。

(5)父子關系:父對象、子對象、父子關系。這是Qt中所特有的,與類的繼承關系無關,傳遞參數是與parent有關(基類、派生類,或父類、子類,這是對于派生體系來說的,與parent無關)。

2、內存問題例子

例子一

#include #include int main(int argc, char *argv[]){QApplication a(argc, argv);QLabel *label = new QLabel("Hello Qt!");label->show();return ();}

分析:(1)label 既沒有指定parent,也沒有對其調用delete,所以會造成內存泄漏。書中的這種小例子也會出現指針內存的問題。

改進方式:(1)分配對象到棧上而不是堆上

#include #include int main(int argc, char *argv[]){QApplication a(argc, argv);QLabel label("Hello Qt!");();return ();}

(2)設置標志位,close()后會delete label。

label->setAttribute(Qt::WA_DeleteOnClose);

(3)new后手動delete

#include #include int main(int argc, char *argv[]){int ret = 0;QApplication a(argc, argv);QLabel *label = new QLabel("Hello Qt!");label->show();ret = ();delete label;return ret;}

例子二

#include #include int main(int argc, char *argv[]){QApplication app(argc, argv);QLabel label("Hello Qt!");();(Qt::WA_DeleteOnClose);return ();}

運行:

分析:程序崩潰,因為label被close時,delete &label;但label對象是在棧上分配的內存空間,delete棧上的地址會出錯。

有些朋友理解為label被delete兩次而錯誤,可以測試QLabel label("Hello Qt!"); ();delete &label;第一次delete就會出錯。

例子三

#include #include int main(int argc, char* argv[]){QApplication app(argc, argv);QLabel label("Hello Qt!");QWidget w;(&w);();return ();}

分析:Object內部有一個list,會保存children,還有一個指針保存parent,當自己析構時,會自己從parent列表中刪除并且析構所有的children。

w比label先被析構,當w被析構時,會刪除chilren列表中的對象label,但label是分配到棧上的,因delete棧上的對象而出錯。

【領 QT開發教程 學習資料, 點擊下方鏈接莬費領取↓↓ ,先碼住不迷路~】

點擊這里:

改進方式:(1)調整一下順序,確保label先于其parent被析構,label析構時將自己從父對象的列表中移除自己,w析構時,children列表中就不會有分配在stack中的對象了。

#include #include int main(int argc, char* argv[]){QApplication app(argc, argv);QWidget w;QLabel label("Hello Qt!");(&w);();return ();}

(2)將label分配到堆上

QLabel *label = new QLabel("Hello Qt!");label->setParent(&w)

或者QLabel *label = new QLabel("Hello Qt!",this);

例子四:野指針

#include #include int main(int argc, char* argv[]){QApplication app(argc, argv);QWidget *w = new QWidget;QLabel *label = new QLabel("Hello Qt!");label->setParent(w);w->show();delete w;label->setText("go"); //野指針return ();}

(上述程序不顯示Label,僅作測試)

分析:程序異常結束,delete w時會delete label,label成為野指針,調用label->setText("go");出錯。

改進方式:QPointer智能指針

#include #include #include int main(int argc, char* argv[]){QApplication app(argc, argv);QWidget *w = new QWidget;QLabel *label = new QLabel("Hello Qt!");label->setParent(w);QPointerp = label;w->show();delete w;if (!()) {label->setText("go");}return ();}

例子五:deleteLater

當一個QObject正在接受事件隊列時如果中途被你銷毀掉了,就是出現問題了,所以QT中建大家不要直接Delete掉一個QObject,如果一定要這樣做,要使用QObject的deleteLater()函數,它會讓所有事件都發送完一切處理好后馬上清除這片內存,而且就算調用多次的deletelater也不會有問題。

發送一個刪除事件到事件系統:

void QObject::deleteLater(){QCoreApplication::postEvent(this, new QEvent(QEvent::DeferredDelete));}

3、智能指針

如果沒有智能指針,程序員必須保證new對象能在正確的時機delete,四處編寫異常捕獲代碼以釋放資源,而智能指針則可以在退出作用域時(不管是正常流程離開或是因異常離開)總調用delete來析構在堆上動態分配的對象。

Qt家族的智能指針:

智能指針

引入

QPointer

Qt Object 模型的特性(之一)

注意:析構時不會delete它管理的資源

QSharedPointer

帶引用計數

QWeakPointer

QScopedPointer

QScopedArrayPointer

QScopedPointer的派生類

QSharedDataPointer

用來實現Qt的隱式共享(Implicit Sharing)

QExplicitlySharedDataPointer

顯式共享

std::auto_ptr

std::shared_ptr

std::tr1::shared_ptr

C++0x

std::weak_ptr

std::tr1::weak_ptr

C++0x

std::unique_ptr

boost::scoped_ptr

C++0x

(1)QPointer

QPointer是一個模板類。它很類似一個普通的指針,不同之處在于,QPointer 可以監視動態分配空間的對象,并且在對象被 delete 的時候及時更新。

QPointer的現實原理:在QPointer保存了一個QObject的指針,并把這個指針的指針(雙指針)交給全局變量管理,而QObject 在銷毀時(析構函數,QWidget是通過自己的析構函數的,而不是依賴QObject的)會調用QObjectPrivate::clearGuards 函數來把全局 GuardHash 的那個雙指針置為*零,因為是雙指針的問題,所以QPointer中指針當然也為零了。用isNull 判斷就為空了。

// QPointer 表現類似普通指針QDate *mydate = new QDate(QDate::currentDate());QPointer mypointer = mydata;mydate->year(); // ->2005mypointer->year(); // ->2005// 當對象 delete 之后,QPointer 會有不同的表現delete mydate;if(mydate == NULL)printf("clean pointer");elseprintf("dangling pointer");// 輸出 dangling pointerif(())printf("clean pointer");elseprintf("dangling pointer");// 輸出 clean pointer

(2)std::auto_ptr

// QPointer 表現類似普通指針QDate *mydate = new QDate(QDate::currentDate());QPointer mypointer = mydata;mydate->year(); // ->2005mypointer->year(); // ->2005// 當對象 delete 之后,QPointer 會有不同的表現delete mydate;if(mydate == NULL)printf("clean pointer");elseprintf("dangling pointer");// 輸出 dangling pointerif(())printf("clean pointer");elseprintf("dangling pointer");// 輸出 clean pointeauto_ptr被銷毀時會自動刪除它指向的對象。std::auto_ptrlabel(new QLabel("Hello Dbzhang800!"));

(3)其他的類參考相應文檔。

4、自動垃圾回收機制

(1)QObjectCleanupHandler

Qt 對象清理器是實現自動垃圾回收的很重要的一部分。QObjectCleanupHandler可以注冊很多子對象,并在自己刪除的時候自動刪除所有子對象。同時,它也可以識別出是否有子對象被刪 除,從而將其從它的子對象列表中刪除。這個類可以用于不在同一層次中的類的清理操作,例如,當按鈕按下時需要關閉很多窗口,由于窗口的 parent 屬性不可能設置為別的窗口的 button,此時使用這個類就會相當方便。

#include #include #include int main(int argc, char* argv[]){QApplication app(argc, argv);// 創建實例QObjectCleanupHandler *cleaner = new QObjectCleanupHandler;// 創建窗口QPushButton *w = new QPushButton("Remove Me");w->show();// 注冊第一個按鈕cleaner->add(w);// 如果第一個按鈕點擊之后,刪除自身QObject::connect(w, SIGNAL(clicked()), w, SLOT(deleteLater()));// 創建第二個按鈕,注意,這個按鈕沒有任何動作w = new QPushButton("Nothing");cleaner->add(w);w->show();// 創建第三個按鈕,刪除所有w = new QPushButton("Remove All");cleaner->add(w);QObject::connect(w, SIGNAL(clicked()), cleaner, SLOT(deleteLater()));w->show();return ();}

在上面的代碼中,創建了三個僅有一個按鈕的窗口。第一個按鈕點擊后,會刪除掉自己(通過 deleteLater() 槽),此時,cleaner 會自動將其從自己的列表中清除。第三個按鈕點擊后會刪除 cleaner,這樣做會同時刪除掉所有未關閉的窗口。

(2)引用計數

應用計數是最簡單的垃圾回收實現:每創建一個對象,計數器加 1,每刪除一個則減 1。

class CountedObject : public QObject{Q_OBJECTpublic:CountedObject(){ctr=0;}void attach(QObject *obj){ctr++;connect(obj, SIGNAL(destroyed(QObject*)), this, SLOT(detach()));}public slots:void detach(){ctr--;if(ctr <= 0)delete this;}private:int ctr;};

利用Qt的信號槽機制,在對象銷毀的時候自動減少計數器的值。但是,我們的實現并不能防止對象創建的時候調用了兩次attach()。

(3)記錄所有者

更合適的實現是,不僅僅記住有幾個對象持有引用,而且要記住是哪些對象。例如:

class CountedObject : public QObject{public:CountedObject() {}void attach(QObject *obj) {// 檢查所有者if(obj == 0)return;// 檢查是否已經添加過if((obj))return;// 注冊(obj);connect(obj, SIGNAL(destroyed(QObject*)), this, SLOT(detach(QObject*)));}public slots:void detach(QObject *obj) {// 刪除(obj);// 如果最后一個對象也被 delete,刪除自身if(() == 0)delete this;}private:QList owners;};

現在我們的實現已經可以做到防止一個對象多次調用 attach() 和 detach() 了。然而,還有一個問題是,我們不能保證對象一定會調用 attach() 函數進行注冊。畢竟,這不是 C++ 內置機制。有一個解決方案是,重定義 new 運算符(這一實現同樣很復雜,不過可以避免出現有對象不調用 attach() 注冊的情況)。

Qt 簡化了我們對內存的管理,但是,由于它會在不太注意的地方調用 delete,所以,使用時還是要當心。

【領 QT開發教程 學習資料, 點擊下方鏈接莬費領取↓↓ ,先碼住不迷路~】

點擊這里:

原文鏈接:/taiyang1987912/article/details/29271549

關鍵詞:

最近更新

關于本站 管理團隊 版權申明 網站地圖 聯系合作 招聘信息

Copyright © 2005-2023 創投網 - m.zhigu.net.cn All rights reserved
聯系我們:39 60 29 14 2@qq.com
皖ICP備2022009963號-3

主站蜘蛛池模板: 国内精品小视频 | 国产又黄视频 | 亚洲精品福利在线 | 国产又粗又黄又爽视频 | 欧美激情第三页 | 成人av男人的天堂 | 国产天美传媒性色av出轨 | 色噜噜狠狠成人中文综合 | 国产精品自在在线午夜出白浆 | 亚洲综合制服丝袜另类 | 国产精品夫妇激情 | 久久亚洲精品无码观看网站 | 在线观看精品91福利 | 中文字幕无码日韩中文字幕 | 亚洲jizzjizz少妇野女人 | 蜜桃91丨九色丨蝌蚪91桃色 | av无遮挡| 国产在线精品一区二区不卡麻豆 | 性开放网站 | 蜜桃视频成人 | 久久久久青草线焦综合 | 亚洲国产区男人本色 | 中文字幕久久久 | 中文字幕在线观看国产 | 国产在线色 | 色一乱一伦一图一区二区精品 | 日本www在线观看 | 日本丰满妇人成熟免费中文字幕 | 动漫成人无码精品一区二区三区 | 无码少妇精品一区二区免费动态 | 国产伦精品一区二区三区在线 | www.久久久com | 精品香蕉在线观看视频 | www国产在线 | 四虎国产精品永久免费地址 | 九九99九九精彩4 | 亚洲香蕉在线观看 | 亚洲国产精品久久久久婷婷软件 | 亚洲不卡中文字幕 | 91干干干 | 欧美性插b在线视频网站 | 久热超碰 | 少妇激情偷公乱柔佳 | 人与动牲交av免费 | 亚洲成av大片大片在线播放 | 国产91免费观看 | 亚洲成av人在线观看网址 | 欧美性色a | 日一日干一干 | 范冰冰特黄xx大片 | 婷婷久久综合九色综合 | 婷婷亚洲天堂 | 大学生疯狂高潮呻吟免费视频 | 中国丰满猛少妇xxxx | 99在线精品视频观看 | 91久久香蕉国产日韩欧美9色 | 屁屁影院ccyy备用地址 | 福利在线视频导航 | 国产真实乱对白精彩久久小说 | 主站蜘蛛池模板: 蛛词}| 中文在线а天堂中文在线新版 | 女人被黑人躁得好爽视频 | 偷拍福利视频一区二区三区 | 久久久国产高清 | 久久九九精品国产综合喷水 | 国产成人久久77777精品 | 五月激情婷婷网 | 国产精品熟妇一区二区三区四区 | 天天色天天 | 加勒比久草 | 又硬又爽又长又粗又大毛片 | 欧美品无码一区二区三区在线蜜桃 | 国产无套在线 | 精品自拍视频 | 中文字幕交换岬奈奈美 | 天堂资源在线www中文 | 国产综合网站 | 婷婷久久综合九色综合97 | 天天看天天爽 | 免费看毛片基地 | 日本一级免费视频 | 午夜宅男在线视频 | 国产精品偷伦一区二区 | 亚洲国产成人av人片久久 | 黑人粗长大战亚洲女 | 亚州男人天堂 | 亚洲色欲色欲综合网站 | 99涩涩| 黄色片免费在线播放 | av在线播放日韩亚洲欧我不卡 | 亚洲人成电影网站色mp4 | 日韩一区二区三区四区区区 | 亚洲日本va | 欧美性大片xxxxx久久久 | 国产一级特黄视频 | 中字无码av电影在线观看网站 | 欧美性福利 | 欧美精品亚洲精品日韩已满十八 | 亚洲中文av一区二区三区 | 国产成人夜色高潮福利影视 | 人妻丰满av无码中文字幕 | 欧美激情性xxxxx高清真 | 巩俐性三级播放 | 欧洲精品成人免费视频在线观看 | 九色精品国产成人综合网站 | 狠狠色噜噜狠狠狠777米奇小说 | 五月开心播播网 | www.日本黄 | 在线中文av | 九九热精品视频 | 日本熟妇丰满大白屁毛片 | 国产亚洲综合精品 | 老司机在线精品视频网站的优点 | 亚洲日日爽 | 亚洲天堂免费视频 | 国产免费艾彩sm调教视频 | 91精产品一区一区三区40p | 四虎永久在线精品884aa | 国产伊人av | 主站蜘蛛池模板: 蛛词}| 国产亚洲美女精品久久久 | 成人区人妻精品一区二区不卡 | 加勒比人妻av无码不卡 | 久久婷婷香蕉热狠狠综合 | 色吊丝最新永久免费观看网址 | 亚洲天堂一区二区三区四区 | 久久香蕉国产线看观看怡红院妓院 | 午夜伦全在线观看 | 少妇wwb搡bbbb搡hd | 久久精品影视免费观看 | 亚洲综合伊人久久综合 | 全部露出来毛走秀福利视频 | 久久福利社 | 成年人在线免费观看av | 欧美成人自拍 | 乱码视频午夜间在线观看 | 亚洲综合久久精品无码色欲 | 亚洲精品久久国产高清小说 | 精品国产一区二区三区久久久 | 18禁成年免费无码国产 | 国产成人精品av | 97超碰人人人人人人少妇 | 欧美日韩中文字幕视频不卡一二区 | 伊人精品成人久久综合全集观看 | av色蜜桃一区二区三区 | 亚洲性无码一区二区三区 | 亚欧乱色国产精品免费视频 | 欧美精品第二页 | 精品人妻系列无码人妻不卡 | 青青手机在线视频 | 中文字幕在线日亚州9 | 丁香婷婷激情 | 国产麻豆剧果冻传媒兄妹蕉谈 | 亚洲一级免费在线观看 | 欧美老熟妇乱子伦视频 | 国产精品一区在线蜜臀 | 国产精品爽爽va在线观看无码 | 中文字幕精品亚洲无线码一区应用 | 另类婷婷 | 日韩欧美亚 | 亚洲视频在线观看免费 | 天天做夜夜爽 | 久久精品66 | 另类亚洲综合区图片区小说 | 亚洲欧洲一区二区三区 | 揉丰满老妇老女人的毛片 | 国产大量精品视频网站 | 岛国av无码免费无禁网站 | 91免费黄色 | 另类αv欧美另类aⅴ | 麻豆国产人妻欲求不满 | 色播综合网 | av一级黄色| 国产精品视频h | 一区二区不卡 | 久久综合伊人77777麻豆最新章节 | 国内精品国产三级国产aⅴ久 | 深爱开心激情网 | 中文字幕精品一区二区三区在线 | 主站蜘蛛池模板: 蛛词}| 婷婷狠狠久久久一本精品 | 天天躁夜夜操 | 免费人妻无码不卡中文视频 | 荫蒂被男人添的好舒服爽免费视频 | 欧美少妇一级片 | 久久中文字幕人妻熟女 | 久久99久久98精品免观看软件 | 97色偷偷色噜噜男人的天堂 | 国产成人在线影院 | 成人在线免费播放 | 亚洲男人的天堂在线观看 | 久视频在线 | 成人免费色视频 | 国精品99久9在线 | 免费 | 少妇粉嫩小泬喷水视频 | 91成人国产综合久久精品 | 性高爱久久久久久久久 | 亚洲片在线 | 国精产品一区一区三区免费视频 | caopeng在线视频 | 天天躁夜夜躁av天天爽 | av网站免费在线观看 | 亚洲区色欧美另类图片 | 欧美极品少妇xxxxⅹ裸体艺术 | 少妇网站在线观看 | 97人人插 | 黑人巨大av | 亚洲日韩激情无码一区 | 国产大学生自拍视频 | 国产艳妇av在线出轨 | 免费无码又爽又黄又刺激网站 | 亚洲国产日韩一区三区 | 国产成人免费在线观看视频 | 亚洲视频日韩视欧美视频 | 久久亚洲影视 | 国产亚洲欧美日韩在线一区 | 午夜精品射精入后重之免费观看 | www.久久久久 | 精品国偷自产国产一区 | 四虎av在线 | 麻豆国产96在线日韩麻豆 | 国内精品视频一区二区三区八戒 | 人人妻人人妻人人片色av | 婷婷在线观看视频 | 欧美人与动牲交app视频 | 国产精品乱码久久久久软件 | 五月伊人婷婷 | 亚洲精品日韩一区二区小说 | 波多野结衣在线观看一码 | 无码国产精成人午夜视频 | 深夜福利在线免费观看 | 中文字幕第10页码 | 在线视频一区二区 | 午夜免费激情视频 | 伊人影院综合在线 | 国产成人av激情在线播放 | 91特黄| 综合人妻久久一区二区精品 | 欧美午夜视频在线观看 | 主站蜘蛛池模板: 蛛词}| 热久久国产欧美一区二区精品 | 久99国产精品人妻aⅴ | 午夜久久久久久 | 婷婷久久久 | 天堂av一区二区 | 狠狠色狠狠色综合日日五 | 嫩草视频 | 人妻丝袜中文无码av影音先锋专区 | 日韩精品久| 亚洲情a成黄在线观看动漫尤物 | 国产精品三级国产电影 | 天天操夜夜想 | 亚洲精品无码一区二区三区久久久 | 中文字幕日产乱码六区小草 | 久久久久精彩视频 | 国内自拍av | 俄罗斯性欧美 | 精品无码一区二区三区爱欲 | 久久亚洲中文无码咪咪爱 | 精品久久人人爽天天玩人人妻 | 91资源在线视频 | 国产精品国产三级国av麻豆 | www.17c亚洲蜜桃 | 国产亚洲精品福利在线无卡一 | 男女扒开双腿猛进入免费看污 | 少妇精品高潮欲妇又嫩中文字幕 | av无码久久久久久不卡网站 | 夏目彩春娇喘呻吟高潮迭起 | www国产 | 18禁裸乳啪啪无遮裆网站 | 国产黄在线看 | 国产精品三级一区二区 | 国产在线欧美 | 天堂网www天堂在线中文 | 亚洲午夜伦理 | 亚洲男人av天堂男人社区 | 免费无码又爽又刺激动态图 | 日本高清视频免费观看 | 秋霞av在线| 成在人线无码aⅴ免费视频 日韩男人天堂 | 亚洲三级黄 | 97在线国产| 国产在线乱码一区二三区 | 成 人 综合 亚洲另类 | 日韩一区二区三区欧美 | www成人国产高清内射 | 日韩男人的天堂 | 毛片国产| 91亚州| 国产精品毛片一区二区在线看 | 色偷偷亚洲第一成人综合网址 | 福利视频导航网址 | 久久久av免费 | 在线天堂新版资源www在线 | 91精品国产乱码久久桃 | 农民人伦一区二区三区剧情简介 | 久久这里只有精品国产免费10 | 国产xxxxx视频| 美女视频黄的全免费视频网站 |