首先我們講一下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 程式使用動態記憶體出於以下...