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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Qt智能指针--QWeakPointer

發布時間:2025/1/21 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt智能指针--QWeakPointer 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 概述
    • QWeakPointer
    • 示例

概述

前面我們說到的QSharedPointer是一個強引用類型的智能指針,而QWeakPointer是一個弱引用類型的智能指針,和C++中的weak_ptr功能是一樣的。

QWeakPointer 是為配合 QSharedPointer 而引入的一種智能指針,它更像是 QSharedPointer 的一個助手(因為它不具有普通指針的行為,沒有重載operator*和->)。它的最大作用在于協助 QSharedPointer 工作,像一個旁觀者一樣來觀測資源的使用情況。

QWeakPointer

QWeakPointer不能用于直接取消引用指針,但它可用于驗證指針是否已在另一個上下文中被刪除。并且QWeakPointer對象只能通過QSharedPointer的賦值來創建。

需要注意的是,QWeakPointer不提供自動轉換操作符來防止錯誤發生。即使QWeakPointer跟蹤指針,也不應將其視為指針本身,因為它不能保證指向的對象保持有效。

說了那么多,QWeakPointer到底有什么用呢?
答案就是:解除循環引用。

在概述中我們說到,QWeakPointer 是為配合 QSharedPointer 而引入的一種智能指針。而什么叫循環引用,就是說:兩個對象互相使用一個 QSharedPointer成員變量指向對方(你中有我,我中有你)。由于QSharedPointer是一個強引用的計數型指針,只有當引用數為0時,就會自動刪除指針釋放內存,但是如果循環引用,就會導致QSharedPointer指針的引用永遠都不能為0,這時候就會導致內存無法釋放。
所以QWeakPointer誕生了,它就是為了打破這種循環的。并且,在需要的時候變成QSharedPointer,在其他時候不干擾QSharedPointer的引用計數。它沒有重載 * 和 -> 運算符,因此不可以直接通過 QWeakPointer 訪問對象,典型的用法是通過 lock() 成員函數來獲得 QSharedPointer,進而使用對象。

示例

首先,我們來看一個QSharedPointer循環使用的示例:

#include <QWidget> #include <QDebug> #include <QWeakPointer> #include <QSharedPointer>class Children; class Parent { public:~Parent(){qDebug() << __FUNCTION__;}QSharedPointer<Children> m_pChildren; }; class Children { public:~Children(){qDebug() << __FUNCTION__;}QSharedPointer<Parent> m_pParent; };class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent = 0);~Widget();void test(); }; #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {test(); }Widget::~Widget() {qDebug() << __FUNCTION__; }void Widget::test() {QSharedPointer<Parent> parent(new Parent());QSharedPointer<Children> children(new Children());if(parent && children){parent->m_pChildren = children;children->m_pParent = parent;} }

在構造函數中調用test()函數,執行完過后應該會自動釋放parent和children對象,但是由于相互引用,在退出之前,引用計數為2,退出之后引用計數還是1,所以導致不能自動釋放,并且此時這兩個對象再也無法訪問到。運行過后發現并沒有進入到Parent和Children的析構函數中。這就導致了內存泄漏。

那么該如何解決這個問題呢?
很簡單,直接將上述代碼兩個類中的成員變量聲明

QSharedPointer<Children> m_pChildren;QSharedPointer<Parent> m_pParent;

改成

QWeakPointer<Children> m_pChildren;QWeakPointer<Parent> m_pParent;

這時候再次運行,就會看到輸出:

~Children ~Parent

這是因為在test()退出之前引用計數是1,函數退出之后就自動析構,這就解除了上面的循環引用。

參考:
https://blog.csdn.net/Tanswer_/article/details/79039617

總結

以上是生活随笔為你收集整理的Qt智能指针--QWeakPointer的全部內容,希望文章能夠幫你解決所遇到的問題。

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