C 的智慧型指標

2021-10-24 18:03:30 字數 2411 閱讀 9332

每日面經–10.14

c++的智慧型指標

想要弄清楚智慧型指標就要明白它為什麼會產生,動態管理、動態陣列、動態記憶體分配等都需要在堆上申請一塊記憶體去儲存自己的東西。你可能會覺得你自己用不到,我隨便舉乙個栗子:比如說你下午要去買水果,但是不知道自己想買多少水果,但是由於現在必須出門,所以你要帶多大的口袋是不知道的。在c++中你知道要儲存一些資料到乙個陣列,你又想剛好陣列的大小是你這些資料的大小。所以你就可以申請乙個動態陣列,當前面計算好了資料的大小,你這邊直接賦值,比如下列程式:

如果p不申請為動態陣列的話,那麼會出現以下錯誤:

若為靜態陣列的話,這個n必須是常數。請注意申請了動態陣列後需要用delete刪除,所以delete和new是一對操作,delete和new他兩都是一對cp出現,不刪除的話就會有記憶體洩露。智慧型指標的作用就是它自己有delete包含,到了函式結束的時候,它自動呼叫自己的析構函式。

智慧型指標,c++11有這三個:auto_ptr,unique_ptr,shared_ptr。

砸門乙個乙個給大家介紹:

auto_ptr這個智慧型指標是最先出現的,其中有乙個缺點有點難受,就是乙個auto_ptr1賦值給另乙個auto_ptr2後,auto_ptr1會直接沒了,之後是不能對auto_ptr1進行操作的。如下圖

// an highlighted block

(new(1

));id

();// 引發異常

unique_ptr既然前面的auto_ptr容易丟棄以往的資料,那麼這個智慧型指標就直接是不許賦值構造和複製構造,如下圖

int main()

雖然不能實現賦值,但是可以將所有權給別的智慧型指標,如下圖

int main() 

以上這兩個智慧型指標都不能進行用**=進行賦值,但是shared_ptr**指標卻可以,如下圖所示:

#include #include using namespace std;

class a

; ~a()

};int main()

程式的輸出結果如下:

2,2,223

2 destructed

end5 destructed

4 destructed

3 destructed

可以用第 14 行及第 16 行的形式讓多個 shareclptr 物件託管同乙個指標。這多個 shared_ptr 物件會共享乙個對共同託管的指標的「託管計數」。有 n 個 shared_ptr 物件託管同乙個指標 p,則 p 的託管計數就是 n。當乙個指標的託管計數減為 0 時,該指標會被釋放。shared_ptr 物件消亡或託管了新的指標,都會導致其原託管指標的託管計數減 1。

第 20、21 行,shared_ptr 的 reset 成員函式可以使得物件解除對原託管指標的託管(如果有的話),並託管新的指標。原指標的託管計數會減 1。

輸出的第 4 行說明,用 new 建立的動態物件 a(2) 被釋放了。程式中沒有寫 delete 語句,而 a(2) 被釋放,是因為程式的第 23 行執行後,已經沒有 shared_ptr 物件託管 a(2),於是 a(2) 的託管計數變為 0。最後乙個解除對 a(2) 託管的 shared_ptr 物件會釋放 a(2)。

main 函式結束時,sp1、sp2、sp3 物件消亡,各自將其託管的指標的託管計數減為 0,並且釋放其託管的指標,於是會有以下輸出:

5 destructed

4 destructed

3 destructed

只有指向動態分配的物件的指標才能交給 shared_ptr 物件託管。將指向普通區域性變數、全域性變數的指標交給 shared_ptr 託管,編譯時不會有問題,但程式執行時會出錯,因為不能析構乙個並沒有指向動態分配的記憶體空間的指標。

注意,不能用下面的方式使得兩個 shared_ptr 物件託管同乙個指標:

a* p = new a(10);

shared_ptr sp1(p), sp2(p);

sp1 和 sp2 並不會共享同乙個對 p 的託管計數,而是各自將對 p 的託管計數都記為 1(sp2 無法知道 p 已經被 sp1 託管過)。這樣,當 sp1 消亡時要析構 p,sp2 消亡時要再次析構 p,這會導致程式崩潰。

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 智慧型指標

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