智慧型指標庫:減輕記憶體分配與追蹤負擔 ,c++11中智慧型指標的定義實現
助手類與函式
使用共享引用tsahredref和指標tsharedptr等的好處:
侷限性:
使用tips:
下面是sharedpointertesting.inl
檔案中的一些使用的ue4智慧型指標的測試示例
inl檔案:inl檔案是內聯函式的原始檔。內聯函式通常在c++標頭檔案中實現,但是當c++標頭檔案中內聯函式過多的情況下,
我們想使標頭檔案看起來簡潔點,像普通函式那樣將內聯函式宣告和函式定義放在標頭檔案和實現檔案中,
具體做法將是:將內聯函式的具體實現放在inl檔案中,然後在該標頭檔案末尾使用#include引入該inl檔案。
/*
"->"箭頭和"(*)."對於智慧型指標指向的物件的修改都是有效的,
對於多個智慧型指標指向的物件,釋放其中乙個智慧型指標,其指向的物件並不會被銷毀*/;
tsharedptr< fsharedtest, mode >
sharedarray
(new
fsharedtest()
);sharedarray-
>bfoo =
true
;// test dereference operator
(*sharedarray )
.bfoo =
false
;// create an additional reference to an existing shared pointer
tsharedptr< fsharedtest, mode >
othersharedarrayreference
( sharedarray )
;// release original reference (object should not be destroyed)
sharedarray.
reset()
;//釋放其中乙個智慧型指標,其指向的物件並不會被銷毀
// note: othersharedarrayreference goes out of scope here (object is destroyed)
}
/*
這幾個智慧型指標指向的物件實際上還是同乙個物件,但是能獲取到物件的值根據智慧型指標的類來決定*/;
class
fderived
:public fbase ;
}
// test 'const'
/*總結:
同型別的智慧型指標物件可以進行比較,型別不同不能作比較(例如int32和float)
分配const指標(僅引用,可以!)
指向const物件的智慧型指標不能隱式轉換為沒有const標記的智慧型指標,需要顯式的呼叫constcastsharedptr()
constcastsharedptr()就是將「const」智慧型指標轉變為「mutable」智慧型指標
「mutable」的智慧型指標可以直接分配給「const」型別的智慧型指標
舉例:constptra=constptrb // √ 分配const指標
constptra=mutableptrc // √ 分配const指標
mutableptrc=constptrb // x 不可以隱式的const_cast轉變
mutableptrc=constcastsharedptr(constptrb) // √ 顯式的呼叫constcastsharedptr(),可以將「const」智慧型指標轉變為「mutable」智慧型指標
/*
關於tsharedptr和tshareref*/*
****
****
****
****
****
****tsharedptr***
****
****
****
****
****
**//空物件的 智慧型指標 tsharedptr
tsharedptr<
float
, mode > floatptr;
為flase,floatptr.get()為nullptr
tsharedptr<
float
, mode > floatptra =
nullptr
;tsharedptr<
float
, mode >
floatptra
(nullptr);
//給值 tsharedptr
tsharedptr<
float
, mode >
floatptr
(new
float
(1.0f))
;tsharedptr<
float
, mode > floatptr =
makesharable
(new
float
(1.0f))
;tsharedptr<
float
, mode > floatptr =
newfloat
(1.0f);
//錯誤
tsharedptr<
float
, mode > floatptr =
float
(1.0f);
//錯誤
tsharedptr<
float
, mode > floatptr (
float
(1.0f))
;//錯誤
//tsharedptr之間的
tsharedptr<
float
, mode > floatptra = floatptr;
//這兩個智慧型指標指向同一物件
tsharedptr<
float
, mode >
floatptrb
(floatptra)
;//floatptrb和floatptra智慧型指標指向同乙個物件
//從tsharedref到tsharedptr
tsharedptr<
float
, mode >
floatptrb
(floatref)
;tsharedptr<
float
, mode > floatptrb = floatref;**
****
****
****
****
****
***tsharedref***
****
****
****
****
****
**tsharedref<
float
, mode >
floatref
(new
float
(1.0f))
;tsharedref<
float
, mode > floatref =
makeshareable
(new
float
(123.0f))
;tsharedref<
float
, mode > floatref;
//錯誤,tsharedref沒有預設構造,不會編譯
//tsharedref沒有隱式建構函式來表示指標(包括nullptr),需要tosharedref()函式
tsharedref<
float
, mode > floatref =
nullptr
;//錯誤
tsharedref<
float
, mode > floatref = floatptr;
//錯誤
tsharedref<
float
, mode >
floatref
(floatptr)
//錯誤
tsharedref<
float
, mode >
floatref
(floatptr.
tosharedref()
);//注意:floatptr需要不能為nullptr,否則執行的時候會斷言包錯
tsharedref<
float
, mode > floatref = floatptr.
tosharedref()
;//注意:floatptr需要不能為nullptr,否則執行的時候會斷言包錯
// tsharedfromthis};
// grab shared pointer to stack-allocated class, before ever assigning it to
// a shared pointer reference. this will trigger an assertion!if(
0)//錯誤的:因為myclass這個物件沒有建立這個物件的例項,在asshared()中會觸發斷言
tsharedptr< fmyclass, mode >
theclassptr1
(new
fmyclass()
);}
指標(4)智慧型指標的使用
why shared ptr 1 如果指標作為類成員時,使用shared ptr封裝原始指標,解決了複製類物件出現的問題 相較原始指標 如果是非記憶體資源 比如 互斥器 可以在構造時再傳乙個刪除器 deleter 引數 shared ptr可以,auto ptr不能 因為shared ptr預設行為...
UE4材質中的SphereMask
spheremask是個神奇的東東。看名字就知道大概什麼意思,球形遮罩。從演示中可以看出,當鏡頭距離越來越近時,材質開始發光。鏡頭邊遠時,材質發光變弱,直到完全不發光。spheremask有四個輸入引數。a 待檢查的位置。b 圓心的位置。radius 半徑。hardness 硬度,0是完整過渡,10...
智慧型指標類模板(中) Qt中的智慧型指標
qt中的智慧型指標 qpointer 當其指向的物件被銷毀時,它會被自動置空 析構時不會自動銷毀所指向的物件 qsharedpointer 引用計數型智慧型指標 可以被自由的拷貝和賦值 當引用計數為0時才刪除指向的物件 include include using namespace std clas...