在《c++ primer中文版第4版》中,有這麼乙個小節"管理指標成員"。有點好奇,咱也學學,剛開始有點不理解其目的,經過反覆驗證,才知道所以然。以前一直有個錯誤的習慣,看書從第一章看到了最後一章,有點愚昧。現在已經把那種不好的習慣給改了,我想學哪一章,哪一節都行,學我想學的部分即可,要不書這麼多,還這麼厚,看到猴年馬月,說不定哪天阿基公尺德找到支點,把地球給撬起來。
在這本書中,有兩種方法來管理指標成員:定義智慧型指標類和值型類
一、智慧型指標的引子
每個事件的發生,都有乙個因果關係,這裡出現了智慧型指標的解決方案,是處理什麼情況呢?也就是管理指標。。。
先來個小例子:
指標共享同一物件
1.乙個類中存在乙個指標成員;
2.宣告a物件,再宣告b物件,最後用a物件作為b物件的初始值;(複製建構函式)
3.釋放a物件,釋放了指標所指的空間;
4.b物件繼續訪問類中的指標成員???問題來了
#include using namespace std;
class cobj
~cobj()
void showdata() const
private:
int *mptr;
};int main()
執行結果:
a與b中的指標指向同乙個int物件22
釋放指標所指向的空間
0這裡我看了結果,驚嘆了,gcc編譯器也優化得太多了,訪問被刪除的空間都不提示錯誤,無語。我試過了c語言與c++錯誤的例子,gcc與g++編譯都是成功的,後來網上一搜,有人說:老版本的gcc編譯器會提示錯誤,最新版本的gcc做了優化,陣列越界與訪問懸垂指標都不報錯。
但"b.showdata();"語句是錯誤的,必須要避免。
二、定義智慧型指標類--引入使用計數
雖然叫智慧型指標類,但也智慧型不到**去。該智慧型指標負責刪除共享物件,使用者同樣將動態分配的乙個物件位址傳給了類中的指標。但絕對不能釋放指標所指的空間。(不然也不叫智慧型指標了)
以下是《c++ primer中文版第4版》書中的乙個例子,被我修改了,增加了一些列印資訊,更直觀的了解智慧型指標類的使用與目的。
#include using namespace std;
class u_ptr
~u_ptr()
};class hasptr
hasptr(const hasptr &orig) : ptr(orig.ptr), val(orig.val)
hasptr & operator=(const hasptr &rhs)
ptr = rhs.ptr;
val = rhs.val;
return *this;
}~hasptr()
}void getuse() const
private:
u_ptr *ptr;
int val;
};int main()
執行結果:
預設建構函式
建立了a物件: 使用計數 = 1
複製建構函式
建立了b物件: 使用計數 = 2
預設建構函式
建立了c物件: 使用計數 = 1
賦值操作符釋放ptr指標
使用計數 = 3
呼叫析構函式
呼叫析構函式
呼叫析構函式
析構函式釋放ptr指標
三、定義值型類
值型類,類中的指標不會共享同乙個物件,對副本所做的改變不會反映到原有物件上。複製建構函式不再複製指標,而是分配乙個新的int物件,並初始化該物件以儲存被複製物件相同的值。
#include using namespace std;
class u_ptr
~u_ptr()
};class hasptr
hasptr(const hasptr &orig) : ptr(new int(*orig.ptr)), val(orig.val)
hasptr & operator=(const hasptr &ths)
~hasptr()
void showdata() const
private:
int *ptr;
int val;
};int main()
執行結果:
呼叫建構函式
*ptr = 2
val = 2
呼叫複製建構函式
*ptr = 2
val = 2
呼叫建構函式
呼叫賦值操作符
*ptr = 2
val = 2
呼叫析構函式
呼叫析構函式
呼叫析構函式
C 智慧型指標學習筆記
原文 摘錄智慧型指標 auto ptr,unique ptr,shared ptr,weak ptr 智慧型指標的作用是管理乙個指標,因為存在一下的情況 申請的空間再函式結束時忘記釋放,造成記憶體洩漏。使用智慧型指標可以很大程度上的避免這個問題,因為智慧型指標是乙個類,當超出了類的例項物件的作用域時...
智慧型指標學習
最近接觸到智慧型指標很多,於是研究了一下智慧型指標的原理,寫下自己的心得體會,有不對的還請指正。智慧型指標產生的目的 因為在c 中,存在非常複雜的指標錯誤問題,例如,某個物件生成後,指向該物件的指標可能有多個,當我們用delete語句刪除其中的乙個指標後,物件就被銷毀,那麼其餘指向該物件的指標就會懸...
智慧型指標學習
智慧型指標 1.用起來像指標 2.會自己對資源進行釋放 include using namespace std class cstudent void test private char m pszbuf int m n intmain int argc,char ar 建立乙個類,利用該類的構造和...