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的析構函數中。這就導致了內存泄漏。
那么該如何解決這個問題呢?
很簡單,直接將上述代碼兩個類中的成員變量聲明
改成
QWeakPointer<Children> m_pChildren;QWeakPointer<Parent> m_pParent;這時候再次運行,就會看到輸出:
~Children ~Parent這是因為在test()退出之前引用計數是1,函數退出之后就自動析構,這就解除了上面的循環引用。
參考:
https://blog.csdn.net/Tanswer_/article/details/79039617
總結
以上是生活随笔為你收集整理的Qt智能指针--QWeakPointer的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt智能指针--QSharedPoint
- 下一篇: Qt QGraphics体系及刷新机制介