Qt智能指针--QSharedPointer
文章目錄
- 前言
- QSharedPointer
- 值得一提
前言
Qt智能指針QSharedPointer 與 C++中的std::shared_ptr其作用是一樣的,其應用范圍比我們前面說到的QPointer和QScopedPointer更廣。
QSharedPointer
QSharedPointer 是一個共享指針,它與 QScopedPointer 一樣包裝了new操作符在堆上分配的動態對象,但它實現的是引用計數型的智能指針 ,也就是說,與QScopedPointer不同的是,QSharedPointer可以被自由地拷貝和賦值,在任意的地方共享它,所以QSharedPointer也可以用作容器元素。
所謂的計數型指針,就是說在內部QSharedPointer對擁有的內存資源進行引用計數,比如有3個QSharedPointer同時指向一個內存資源,那么就計數3,知道引用計數下降到0,那么就自動去釋放內存啦。
需要注意的是:QSharedPointer 是線程安全的,因此即使有多個線程同時修改 QSharedPointer 對象也不需要加鎖。雖然 QSharedPointer 是線程安全的,但是 QSharedPointer 指向的內存區域可不一定是線程安全的。所以多個線程同時修改 QSharedPointer 指向的數據時還要應該考慮加鎖。
先來看一個官方示例:
static void doDeleteLater(MyObject *obj){obj->deleteLater();}void otherFunction(){QSharedPointer<MyObject> obj =QSharedPointer<MyObject>(new MyObject, doDeleteLater);// continue using objobj.clear(); // calls obj->deleteLater();}這個示例中,傳入了一個函數,用于自定義刪除。
也可以直接使用成員函數:
QSharedPointer<MyObject> obj =QSharedPointer<MyObject>(new MyObject, &QObject::deleteLater);QSharedPointer使用非常方便,直接和普通指針用法一樣,創建后直接用,后面就不用管了。
再來看一個自己寫的簡單示例:
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__; }運行后關閉窗口,輸出:
Widget Student ~Widget ~Student可以看到,student對象被自動釋放了。
值得一提
我們都知道Qt的QObject對象樹系統(父子),當在創建對象時如果指定了父對象,那么該對象就無需手動釋放,會由父對象去做資源回收。我在查詢智能指針相關資料的時候,看到一篇文章,介紹智能指針和QObject對象樹系統結合使用的時候,程序會崩潰,文章在這里,不過這是六年前的博客了。我嘗試了一下,結果并沒有出現崩潰的情況:
還是上面的示例,改動如下:
m_pStudent = QSharedPointer<Student>(new Student(this));在new的時候指定了父對象
運行過后關閉窗口,很正常。我使用的是Qt5.11.1
說明,這些年Qt的更新解決了這個問題。那么我們在用的過程中就可以少些顧慮了,放心使用。
OK,更多文檔說明,參考官方介紹
總結
以上是生活随笔為你收集整理的Qt智能指针--QSharedPointer的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt智能指针--QScopedPoint
- 下一篇: Qt智能指针--QWeakPointer