C 智慧型指標

2021-08-15 09:03:59 字數 1351 閱讀 3312

對於常規指標,如果指向的是動態分配的記憶體,則必須要記得使用delete。智慧型指標模板類正是用來解決這個問題的,解決程式設計師」不記得「的毛病。智慧型指標是行為類似於常規指標的類物件。既然是類物件,就會有析構函式,智慧型指標的析構函式就是執行了delete操作。所以一當智慧型指標無效時,會自動呼叫它的析構函式,把它指向的記憶體也一併釋放掉。這裡介紹三個智慧型指標模板類:(1)auto_ptr。(2)unique_ptr。(3)shared_ptr。要建立智慧型指標物件,必須包含標頭檔案。

auto_ptr

使用方法:

auto_ptrauto_ptr_p(new int);

*auto_ptr_p = 2;

cout << (*auto_ptr_p) << endl;

但對於下面的**:

auto_ptrauto_ptr_p1(new int);

*auto_ptr_p1 = 2;

cout << (*auto_ptr_p1) << endl;

在執行階段會報錯。在**塊中p1被賦給了p2,導致p1和p2指向了相同的記憶體。離開**塊之後,p2的析構函式將釋放這一部分的記憶體。導致p1指向的記憶體無效,這時候想再次通過p1訪問這部分記憶體將出現錯誤。c++11已經將auto_ptr摒棄了。

unique_ptr

unique_ptr的宣告語法與auto_ptr一樣。主要的區別是對於上面的這個錯誤,auto_ptr是在執行階段才會發現錯誤,而對於unique_ptr在編譯階段就能發現錯誤。下面的**是通過不了編譯的:

unique_ptr_p2 = unique_ptr_p1;
但有特殊情況:

#include#include#includeusing namespace std;

unique_ptrgetunique_ptr(int n)

int main()

即如果賦值號=右邊是乙個臨時物件,這可以通過編譯。對於臨時物件,進行賦值完之後,將會無效。因此也就不能通過它來訪問動態分配的記憶體。

另外對於unique_ptr,可以動態分配陣列,而auto_ptr和shared_ptr是不可以的。

unique_ptrunique_ptr_p3(new int[10]);

unique_ptr_p3[1] = 2;

cout << unique_ptr_p3[1] << endl;

shared_ptr

shared_ptr最大的特點是可以隨意賦值。因為它有引用計數。進行賦值操作時,計數將+1,指標過期時,計數-1。僅當最後乙個指標過期時,才會呼叫析構函式釋放指向的記憶體。

c 智慧型指標

auto prt 它是 它所指向物件的擁有者 所以當自身物件被摧毀時候,該物件也將遭受摧毀,要求乙個物件只有乙個擁有者,注意 auto prt 不能使用new 來分配物件給他 include include using namespace std template void bad print au...

c 智慧型指標

很久沒寫部落格了,不知道如何表達了,哈哈.我先介紹一下深淺拷貝.class copy 此時a.ptr和b.ptr指向同乙個物件,當我們delete a.ptr時 b.ptr所指向的物件已經不存在了,要是我們引用b.ptr指向的物件也就會出問題了.深拷貝 把a.ptr所指向的物件拷貝乙份給b.ptr ...

c 智慧型指標

記得前不久有一次面試被問到智慧型指標的實現,當時對智慧型指標只是聽說但沒有了解過,就亂七八糟地說了一遍。今天寫了一遍智慧型指標,用了引用計數的概念。主要思想就是,用乙個新類對原本需要的型別進行了一層封裝,這個新類中儲存了原本的物件指標和乙個引用計數的指標,之所以全部用指標來儲存,就是因為會出現多個新...