c 學習筆記十七 函式指標與智慧型指標

2021-10-03 22:12:56 字數 3045 閱讀 9982

一般的函式指標

語法:

返回型別(*函式名)(參數列)
使用示例:

char (*pfun)(int);   

char glfun(int a)

void main()

第一行定義了乙個指標變數pfun,它是乙個指向某種函式的指標,這種函式引數是乙個int型,返回值是char型別。只有第一句我們還無法使用這個指標,因為我們還未對它進行賦值。

第二行定義了乙個函式glfun()。該函式正好是乙個以int為引數返回char的函式。從指標的層次上理解函式——函式的函式名實際上就是乙個指標,函式名指向該函式的**在記憶體中的首位址

在main()函式中,函式glfun的位址賦值給變數pfun。第二句中「*pfun」顯然是取pfun所指向位址的內容,當然也就是取出了函式glfun()的內容,然後給定引數為2。

使用typedef更直觀更方便

語法:

typedef  返回型別(*新型別)(參數列)
使用示例:

typedef char (*ptrfun)(int);   

ptrfun pfun;

char glfun(int a)

void main()

typedef的功能是定義新的型別。第一句就是定義了一種ptrfun的型別,並定義這種型別為指向某種函式的指標,這種函式以乙個int為引數並返回char型別。後面就可以像使用int,char一樣使用ptrfun了。

第二行的**便使用這個新型別定義了變數pfun,此時就可以像使用形式1一樣使用這個變數了。

1.auto_ptr

作用:對作用域內的動態分配物件的自動釋放

基本型別:

#include #include using namespace std;

int main()

類型別:

#include #include using namespace std;

class test

~test()

void func()

};int main()

缺點:示例:

#include #include using namespace std;

void func(auto_ptrap)

int main()

2.auto_ptr不能管理陣列指標

#include using namespace std;

int main()

3.auto_ptr被拷貝或被賦值後,失去對原指標的管理.這種情況被稱為指標所有權傳遞

#include #include using namespace std;

int main()

總之來說,智慧型指標auto_ptr,進行值傳遞或者賦值操作時,也就是說觸發了他的拷貝建構函式和賦值運算子過載函式時,就會將原物件儲存的位址刪除,再呼叫時就會出現解引用空指標,從而吐核。2.unique_ptr

作用:代替auto_ptr,禁用複製與賦值

#include //#include #include using namespace std;

void func(unique_ptrup)

int main()

class integerptr

void print()

};int main()

共享指標的實現:

#include #include using namespace std;

namespace ministl

};data* p;

void decrease()

}public:

shared_ptr(t* ptr = null):p(new data(ptr)){}

shared_ptr(const shared_ptr& ptr)

shared_ptr&operator=(const shared_ptr& ptr)

~shared_ptr()

t&operator*()

t*operator->()

};}using namespace ministl;

int main()

但是共享指標會造成迴圈引用的問題:

#include #include using namespace std;

class b;

class a

~a()

shared_ptrb; //a類中定義了乙個b的智慧型指標作為成員

};class b

~b()

shared_ptra; //b類中定義了乙個a的智慧型指標作為成員

};int main()

結構圖如下:

為了避免這一情況,從而引出weak_ptr。

5.weak_ptr

用weak_ptr解決迴圈引用:

#include #include using namespace std;

class b;

class a

~a()

shared_ptrb; //a類中定義了乙個b的智慧型指標作為成員

};class b

~b()

weak_ptra; //b類中定義了乙個weak_ptr型別的a的智慧型指標作為成員

};int main()

C 智慧型指標學習筆記

原文 摘錄智慧型指標 auto ptr,unique ptr,shared ptr,weak ptr 智慧型指標的作用是管理乙個指標,因為存在一下的情況 申請的空間再函式結束時忘記釋放,造成記憶體洩漏。使用智慧型指標可以很大程度上的避免這個問題,因為智慧型指標是乙個類,當超出了類的例項物件的作用域時...

C 學習筆記之智慧型指標

眾所周知,c 中最讓程式設計師頭疼的就是關於記憶體的問題,其中不外乎以下幾點 1.緩衝區溢位 2.野指標 3.重複釋放記憶體 4.不配對的new delete 5.記憶體洩露 其中大多數的問題都是對指標的不正確使用帶來的。為此c 標準庫中對原始指標做了一些封裝,比如auto ptr,使得指標更容易使...

C 學習筆記15 智慧型指標分析

智慧型指標的實現 include using namespace std template typename t class smartpointer 實現一片堆空間只能由乙個智慧型指標標識 smartpointer const smartpointer obj 也需要實現一片堆空間只能由乙個智慧型...