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}
當(dāng)一個(gè)類(lèi)的成員里面有指針的時(shí)候,使用默認(rèn)拷貝構(gòu)造函數(shù)的時(shí)候就會(huì)造成多個(gè)對(duì)象管理同一塊內(nèi)存
這樣帶來(lái)的后果就是,如果任意一個(gè)對(duì)象釋放了這一塊內(nèi)存,那么其他的對(duì)象再來(lái)操作這塊內(nèi)存的時(shí)候就會(huì)發(fā)生預(yù)料不到的結(jié)果。
為了避免對(duì)象中保存野指針從而引發(fā)的錯(cuò)誤,提出了智能指針, 它能實(shí)現(xiàn)多個(gè)對(duì)象共享內(nèi)存的自釋放。
其實(shí)這種實(shí)現(xiàn)有點(diǎn)類(lèi)似于delphi中的接口,到處傳來(lái)傳去的,最后自釋放,就是因?yàn)榻涌谟幸糜?jì)數(shù),當(dāng)引用計(jì)數(shù)為1的時(shí)候就把對(duì)象釋放掉。
C++中這種實(shí)現(xiàn)(C++ Primer書(shū)上借鑒來(lái)的),有幾個(gè)比較巧妙的地方
·Has_Ptr這個(gè)類(lèi)其實(shí)是想保存一個(gè)int *的指針,為了避免懸垂指針的出現(xiàn),我們使用了 I_Pointer這個(gè)類(lèi)把懸垂指針包了一下,因此在Has_Ptr這個(gè)類(lèi)的Public接口中不會(huì)出現(xiàn)I_Pointer,只會(huì)出現(xiàn)int *
·事實(shí)上也不能出現(xiàn)I_Pointer, 因?yàn)镻ointer的構(gòu)造函數(shù)定義成Private,不允許在外面構(gòu)造,只能在friend類(lèi)中構(gòu)造,I_Pointer是專(zhuān)門(mén)為Has_Ptr實(shí)現(xiàn)的
·要記住三元組(拷貝構(gòu)造,賦值操作,析構(gòu)),當(dāng)其中一個(gè)需要有特殊操作的時(shí)候,其他的也需要有特殊操作,這個(gè)要形成定勢(shì)思維。
相關(guān)推薦:2011計(jì)算機(jī)等級(jí)考試二級(jí)C輔導(dǎo)實(shí)例編程匯總
計(jì)算機(jī)等級(jí)考試二級(jí)C語(yǔ)言歷年真題匯總(2005-2010)
2011年計(jì)算機(jī)等級(jí)考試二級(jí)C語(yǔ)言常見(jiàn)問(wèn)題匯總
計(jì)算機(jī)等級(jí)考試二級(jí)C語(yǔ)言常見(jiàn)知識(shí)點(diǎn)總結(jié)
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |