Qt 智慧型指標詳細介紹

2021-09-08 02:03:18 字數 3619 閱讀 1936

根據不同的使用場景, 可分為以下幾種:

共享指標. 執行緒安全.

範圍指標. 為了raii1

目的, 維護指標所有權, 並保證其在超出作用域後恰當的被銷毀, 非共享.

qscopedarraypointer

追蹤給定 qobject 物件生命, 並在其析構時自動設定為 null.

比如, 我們現在有乙個類 myclass, 現在要將其改造成支援隱式共享的類.

#if 1   

// myclass 原始版本

class

myclass

myclass

(const myclass &other)

~myclass()

intgetid()

const

void

setid

(int val)

qstring getpath()

const

void

setpath

(qstring val)

private

:int m_id =-1

; qstring m_path;};

#else

// myclass 支援隱式共享

// 1. 將 myclass 的所有資料成員都放到 myclassdata 中.

// 2. 在 myclass 中維護乙個 qshareddatapointerd.

// 3. myclass 中通過 d-> 的形式訪問資料.

// 4. myclassdata 繼承自 qshareddata.

#include

#include

class

myclassdata

:public qshareddata

myclassdata

(const myclassdata &other)

:qshareddata

(other),id

(other.id)

,path

(other.path)

~myclassdata()

int id =-1

; qstring path;};

class

myclass

myclass

(int id,

const qstring & path)

myclass

(const myclass &other):d

(other.d)

~myclass()

intgetid()

const

void

setid

(int val)

qstring getpath()

const

void

setpath

(qstring val)

private

: qshareddatapointer d;};

#endif

#include

class

myclass

myclass

(int id,

const qstring & path)

myclass

(const myclass &other):d

(other.d)

~myclass()

intgetid()

const

void

setid

(int val)

qstring getpath()

const

void

setpath

(qstring val)

private

: qexplicitlyshareddatapointer d;

};

// 指定 deleter

static

void

dodeletelater

(myobject *obj)

void

testsptr()

}/*------------- 實現單例 -------------*/

// cpp 中定義全域性變數

qsharedpointer g_ptrmyobj;

qsharedpointer

getmyobj()

return g_ptrmyobj;

}

#include

#include

classa;

classb;

#define test_memory_will_leak

class

a#ifdef test_memory_will_leak

qsharedpointerptr_b;

#else

qweakpointerptr_b;

#endif

//test_memory_will_leak};

class

b#ifdef test_memory_will_leak

qsharedpointer ptr_a;

#else

qweakpointer ptr_a;

#endif

//test_memory_will_leak};

intmain()

#else

if(!na-

>ptr_b.

tostrongref()

.isnull()

)#endif test_memory_will_leak

}

void

main()

// 退出作用域後析構

// 退出作用域後析構

}

[***以下描述可搜尋 devbean 的 continue-using-qpointer 一文獲取更詳細資訊***].

class

myhelper

void

setbtn

(qpushbutton *btn)

void

funcshow()

if(m_btn2)

}private

: qpointer m_btn;

qpointer m_btn2;

};

raii, resource acquisition is initialization, 資源獲取就是初始化. 是 c++ 的一種管理資源, 避免洩漏的慣用方法. 比如,qmutexlocker為了方便管理qmutex的加鎖和解鎖, 在構造該物件時加鎖, 在析構時解鎖. ↩︎

Qt智慧型指標

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

Qt 智慧型指標學習

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

Qt 智慧型指標例項

myclass const myclass rhs str rhs.str myclass operator const myclass rhs myclass qstring str int main int argc,char argv qdebug test qsharedptr qshare...