陳碩智慧型指標執行緒安全 虛幻4 智慧型指標基礎

2021-10-16 08:18:47 字數 2921 閱讀 9097

首先我們講一下ue4中的uobject

uobject本身就可以幫我們做**,做釋放的。

我們可以看到ue4中所有的類都是繼承自uobject,這樣的話當我們引擎被關閉的時候,它會幫我們自動釋放這些資源,或者是我們手動去釋放掉它,這樣能保證能徹底刪掉它。

那麼如果是原生的類呢?不是繼承uobject的類,怎麼辦?

我們會遇到這樣的問題:

我們建立這個資源,然後忘記把它刪除,於是它佔的記憶體可能永遠都無法被釋放掉。

或者我們建立這個資源,然後有其它的指標指向了它,結果你不小心把它釋放了,其它指標依然保留了原始的資訊,導致我們在訪問這個類的時候而產生野指標奔潰。

從而為了防止這些問題的出現,智慧型指標就出現了,它就是用來管理這些非繼承uobject的類。

std::shared_ptr不是在所有的平台都能用的

可以和其它虛幻容器及型別無縫協作

更好的控制平台特性,包括執行緒處理和優化

等虛擬智慧型指標庫和c++智慧型指標在功能和效率方面都有一些共同的特點。

整體優點

可以像常規的c++指標那樣複製,解引用,比較共享指標等

防止記憶體洩漏:當沒有共享引用時資源自動刪除

包含了可以通過多執行緒安全地進行訪問的「執行緒安全」版本

可以建立任何型別的物件的共享指標

支援針「const」、前置宣告的不完全型別、型別轉換等

詳細內容官方文件:

智慧型指標的主要型別分為:tsharedptr, tsharedref, tweakptr, tuniqueptr。

先宣告乙個測試類

class testa

;

tsharedptr(共享指標)用法

void testsharedptr()

中"."是訪問共享指標的成員,而mytesta->a中"->"是訪問這個指標指向的物件中的成員。

};

共享指標可以置為空「null」

在訪問共享指標時,要先判讀這個共享指標是否有效,如果這個指標無效,將會導致奔潰。

mytesta.isvalid()中"."是訪問共享指標的成員,而mytesta->a中"->"是訪問這個指標指向的物件中的成員

使用tsharedref(共享引用)用法

void testsharedref()

;

1.與共享指標類似,固定引用非空物件

tsharedptr 和 tsharedref之間的相互轉換

void atestsharedrefandptr()

;

使用tweakptr(弱指標)用法

void testtweakptr()

};

先宣告兩個類

class father

;class child :public father

;

派生類轉換為基類

//宣告基類共享指標_father

tsharedptr_father;

//建立派生類共享指標_child

tsharedptr_child = makeshareable(new child);

//派生類轉換為基類,支援隱式轉換

_father = _child;

基類轉換為派生類

//基類轉換為派生類

tsharedptr_child = staticcastsharedptr(_father);

//_child呼叫派生類的成員

if (_child.isvalid())

常量基類轉換為派生類

//建立派生類轉為基類的共享指標,支援隱式轉換

const tsharedptrconst_father = makeshareable(new child);

//先將基類指標轉換為指向基類的指標

tsharedptrconst_father_a = constcastsharedptr(_father);

//然後基類轉換為派生類

tsharedptr_child_a = staticcastsharedptr(_father);

//呼叫派生類成員

if (_child_a.isvalid())

用法和共享指標一樣,只需修改以下即可

宣告乙個類test繼承自tsharedfromthis

class testaa:public tsharedfromthis;

};

為什麼原生的類要繼承自tsharedfromthis<>用法

//建立共享指標

tsharedptrtest_a = makeshareable(new testaa);//在makesharedable的時候會生成乙個弱引用

//呼叫成員函式

test_a->print();

//解引用

testaa* testb = test_a.get();

//普通的指標轉換為共享指標(只有當該類是繼承自tsharedfromthis<>同時原本是共享指標的才可以使用asshared())

if (testb)//先判斷指標部位空

指標(4)智慧型指標的使用

why shared ptr 1 如果指標作為類成員時,使用shared ptr封裝原始指標,解決了複製類物件出現的問題 相較原始指標 如果是非記憶體資源 比如 互斥器 可以在構造時再傳乙個刪除器 deleter 引數 shared ptr可以,auto ptr不能 因為shared ptr預設行為...

c 使用智慧型指標的執行緒安全佇列

整理自c 併發程式設計實戰 使用std shared ptr 的執行緒安全佇列 threadsafe queue ptr.cpp created on mar 2,2018 author clh01s 163.com 為了防止在wait and pop 中引發異常,所以將shared ptr 的初始...

C 基礎回顧4 智慧型指標shared ptr

引入智慧型指標的目的,個人 理解有如下兩點 1.自動釋放記憶體 智慧型指標類能記錄多少個shared ptr指向相同的物件,並在引用計數值為0時自動釋放物件所占用的記憶體。2.記憶體共享 讓多個物件共享底層資料。c 動態記憶體 malloc free,new delete 程式使用動態記憶體出於以下...