C 學習 智慧型指標 8

2021-08-26 17:11:18 字數 2462 閱讀 1172

在《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 建立乙個類,利用該類的構造和...