68 }
69
70 void set_ptr(int *ptr){
71 if (ptr != (this->ptr->p)){
72 this->ptr->p = ptr;
73 }
74 }
75 int* get_ptr(){
76 return ptr->p;
77 }
78};
79
80void test(){
81 int i = 0;
82 Has_Ptr hp(&i);
83 int j = 1;
84 Has_Ptr hp1(&j);
85 hp1 = hp;
86}
87int _tmain(int argc, _TCHAR* argv[])
88{
89 test();
90 return 0;
91}
當一個類的成員里面有指針的時候,使用默認拷貝構(gòu)造函數(shù)的時候就會造成多個對象管理同一塊內(nèi)存
這樣帶來的后果就是,如果任意一個對象釋放了這一塊內(nèi)存,那么其他的對象再來操作這塊內(nèi)存的時候就會發(fā)生預料不到的結(jié)果。
為了避免對象中保存野指針從而引發(fā)的錯誤,提出了智能指針, 它能實現(xiàn)多個對象共享內(nèi)存的自釋放。
其實這種實現(xiàn)有點類似于delphi中的接口,到處傳來傳去的,最后自釋放,就是因為接口有引用計數(shù),當引用計數(shù)為1的時候就把對象釋放掉。
C++中這種實現(xiàn)(C++ Primer書上借鑒來的),有幾個比較巧妙的地方
·Has_Ptr這個類其實是想保存一個int *的指針,為了避免懸垂指針的出現(xiàn),我們使用了 I_Pointer這個類把懸垂指針包了一下,因此在Has_Ptr這個類的Public接口中不會出現(xiàn)I_Pointer,只會出現(xiàn)int *
·事實上也不能出現(xiàn)I_Pointer, 因為Pointer的構(gòu)造函數(shù)定義成Private,不允許在外面構(gòu)造,只能在friend類中構(gòu)造,I_Pointer是專門為Has_Ptr實現(xiàn)的
·要記住三元組(拷貝構(gòu)造,賦值操作,析構(gòu)),當其中一個需要有特殊操作的時候,其他的也需要有特殊操作,這個要形成定勢思維。
相關(guān)推薦:北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |