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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt智能指针--QSharedPointer

發(fā)布時(shí)間:2025/1/21 编程问答 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt智能指针--QSharedPointer 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 前言
    • QSharedPointer
    • 值得一提

前言

Qt智能指針QSharedPointer 與 C++中的std::shared_ptr其作用是一樣的,其應(yīng)用范圍比我們前面說到的QPointer和QScopedPointer更廣。

QSharedPointer

QSharedPointer 是一個(gè)共享指針,它與 QScopedPointer 一樣包裝了new操作符在堆上分配的動態(tài)對象,但它實(shí)現(xiàn)的是引用計(jì)數(shù)型的智能指針 ,也就是說,與QScopedPointer不同的是,QSharedPointer可以被自由地拷貝和賦值,在任意的地方共享它,所以QSharedPointer也可以用作容器元素。

所謂的計(jì)數(shù)型指針,就是說在內(nèi)部QSharedPointer對擁有的內(nèi)存資源進(jìn)行引用計(jì)數(shù),比如有3個(gè)QSharedPointer同時(shí)指向一個(gè)內(nèi)存資源,那么就計(jì)數(shù)3,知道引用計(jì)數(shù)下降到0,那么就自動去釋放內(nèi)存啦。

需要注意的是:QSharedPointer 是線程安全的,因此即使有多個(gè)線程同時(shí)修改 QSharedPointer 對象也不需要加鎖。雖然 QSharedPointer 是線程安全的,但是 QSharedPointer 指向的內(nèi)存區(qū)域可不一定是線程安全的。所以多個(gè)線程同時(shí)修改 QSharedPointer 指向的數(shù)據(jù)時(shí)還要應(yīng)該考慮加鎖。

先來看一個(gè)官方示例:

static void doDeleteLater(MyObject *obj){obj->deleteLater();}void otherFunction(){QSharedPointer<MyObject> obj =QSharedPointer<MyObject>(new MyObject, doDeleteLater);// continue using objobj.clear(); // calls obj->deleteLater();}

這個(gè)示例中,傳入了一個(gè)函數(shù),用于自定義刪除。

也可以直接使用成員函數(shù):

QSharedPointer<MyObject> obj =QSharedPointer<MyObject>(new MyObject, &QObject::deleteLater);

QSharedPointer使用非常方便,直接和普通指針用法一樣,創(chuàng)建后直接用,后面就不用管了。

再來看一個(gè)自己寫的簡單示例:

class Student : public QObject {Q_OBJECT public:Student(QObject * parent = nullptr);~Student(); };class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent = 0);~Widget(); private:QSharedPointer<Student> m_pStudent;}; #include "widget.h" #include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent) {qDebug() << __FUNCTION__;m_pStudent = QSharedPointer<Student>(new Student()); }Widget::~Widget() {qDebug() << __FUNCTION__; }Student::Student(QObject *parent):QObject (parent) {qDebug() << __FUNCTION__; }Student::~Student() {qDebug() << __FUNCTION__; }

運(yùn)行后關(guān)閉窗口,輸出:

Widget Student ~Widget ~Student

可以看到,student對象被自動釋放了。

值得一提

我們都知道Qt的QObject對象樹系統(tǒng)(父子),當(dāng)在創(chuàng)建對象時(shí)如果指定了父對象,那么該對象就無需手動釋放,會由父對象去做資源回收。我在查詢智能指針相關(guān)資料的時(shí)候,看到一篇文章,介紹智能指針和QObject對象樹系統(tǒng)結(jié)合使用的時(shí)候,程序會崩潰,文章在這里,不過這是六年前的博客了。我嘗試了一下,結(jié)果并沒有出現(xiàn)崩潰的情況:

還是上面的示例,改動如下:

m_pStudent = QSharedPointer<Student>(new Student(this));

在new的時(shí)候指定了父對象

運(yùn)行過后關(guān)閉窗口,很正常。我使用的是Qt5.11.1

說明,這些年Qt的更新解決了這個(gè)問題。那么我們在用的過程中就可以少些顧慮了,放心使用。

OK,更多文檔說明,參考官方介紹

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。