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...