Qt智能指针--QSharedPointer
文章目錄
- 前言
- 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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt智能指针--QScopedPoint
- 下一篇: Qt智能指针--QWeakPointer