Qt 智慧型指標例項

2021-07-09 15:04:03 字數 1560 閱讀 1360

myclass(const myclass &rhs):str(rhs.str)

{}myclass &operator=(const myclass &rhs)

~myclass()

qstring str;

};int main(int argc, char *argv)

qdebug() << "test qsharedptr";

qsharedpointers(new myclass);

qsharedpointers1 = s;

qweakpointerw = s;

qdebug() << w.data()->str;

s.clear();

qdebug() << "after s is cleared";

qdebug() << w.data()->str;

qdebug() << "try s, after s is cleared";

if (s.isnull())

qdebug() << "s is null";

else

qdebug() << s->str;

s1.clear();

if (w.isnull())

qdebug() << "w is null";

else

qdebug() << "w still has the resource";

return a.exec();}

智慧型指標思考:

c++使用raii來控制資源的獲得與釋放

一切的資源獲得都是從new開始

那麼如何儲存並追蹤這份資源呢?

如果是常規指標,當該指標所指向的資源被釋放了,我們將不得而知

這會導致執行**到這裡時程式崩潰

所以就有了智慧型指標的出發點:當資源在某處釋放時,你的指標變數能夠自動賦值為null

scoped指標能夠在指標變數宣告週期結束時釋放申請的資源,這與在棧上建立臨時物件的效果一樣

但這樣做的好處也是很明顯的,比如你想把該資源傳到其他**段,就可以用take方法來獲得堆上的指標

這時就將原始指標(資源實際控制指標)傳遞出去,但同時你也要在使用完該資源後將其delete,並且這期間不能將該指標傳給別的**

使用scoped指標最有意義的是,你不用占用寶貴的函式棧空間,卻能夠獲得同樣的使用體驗

shared指標是強指標,當該指標生命週期結束時,他不會釋放自己的資源,這點很像原始指標

直到你呼叫clear時才會將自己所指向的真實指標賦值為null,但在此之前他會檢查自己的引用計數,如果發現有其他的shared指標存在

則不會釋放資源,直到最後乙個shared指標clear之後,才會呼叫真正的delete

weak指標其實是智慧型指標真正要實現的目的,就是當資源釋放後,你能夠偵測到該指標為null

對於乙個shared指標s

qweakpointer

<

myclass

>w=

s;這是weak指標的唯一初始化方式

實際使用中應該是這樣:

在類的成員中定義乙個shared指標,然後不斷的返回weak指標給外部呼叫

Qt智慧型指標

很簡單的入門程式,應該比較熟悉吧 在 從 qt 的 delete 說開來 一文中,我們提到這個程式存在記憶體洩露 表現就是析構函式不被呼叫 而且當時給出了三種解決方法 注 本文中,我們從智慧型指標 smart pointer 角度繼續考慮這個問題 為了管理記憶體等資源,c 程式設計師通常採用raii...

Qt 智慧型指標學習

很簡單的入門程式,應該比較熟悉吧 從 qt 的 delete 說開來 一文中,我們提到這個程式存在記憶體洩露 表現就是析構函式不被呼叫 而且當時給出了三種解決方法 注 本文中,我們從智慧型指標 smart pointer 角度繼續考慮這個問題 為了管理記憶體等資源,c 程式設計師通常採用raii r...

Qt 智慧型指標學習

很簡單的入門程式,應該比較熟悉吧 在 從 qt 的 delete 說開來 一文中,我們提到這個程式存在記憶體洩露 表現就是析構函式不被呼叫 而且當時給出了三種解決方法 注 本文中,我們從智慧型指標 smart pointer 角度繼續考慮這個問題 為了管理記憶體等資源,c 程式設計師通常採用raii...