C 智慧型指標

2021-08-20 17:31:11 字數 1177 閱讀 7177

為什麼會有只智慧型指標:

由於c++沒有自動的記憶體**機制,每次new出來的記憶體都要手動delete,而有時候很容易會遺忘掉delete這一過程,因此會造成嚴重的後果

智慧型指標其實就是定義乙個類,指向一塊記憶體空間,在被異常打斷時,智慧型指標宣告週期結束,然後自動呼叫析構函式釋放該空間,以保證不會發生記憶體洩漏。

常用的幾種智慧型指標:

auto_ptr

std::auto_ptr可以用來管理單個物件的堆記憶體,當有兩個指標指向同乙個記憶體時,第乙個指標將不會再指向該記憶體,相當於第乙個指標將管理權交給了第二個指標,也就是說同時只能有乙個指標指向該記憶體

注意:1、盡量不要使用「operator=」

2、release()函式不會釋放物件,僅僅是歸還所有權

3、std::auto_ptr最好不要當成引數傳遞

4、最好不要使用該指標

scoped_ptr

scoped_ptr也可以同auto_ptr一樣的正常使用,但是沒有release()函式,所以不會導致記憶體洩漏的問題,其次scoped_ptr是獨享所有權的,因此不會有auto_ptr的一些問題,是建議多使用的。

shared_ptr

shared_ptr可以很方便的使用,也沒有release()函式,並且在其內部維護了乙個引用指標,由此可以支援複製、引數傳遞等,其中提供的use_count(),此函式返回其內部的引用計數,也就是說該指標是專門用於共享所有權的。

weak_ptr指標是專門為shared_ptr而準備的,在有的情況下,我們只需要關注使用物件,而不想改變其引用計數,則使用weak_ptr,它相當於shared_ptr的觀測者,只會對其進行引用而不會改變其引用計數,當然在shared_ptr失效後,weak_ptr也會失效。

總結:1、在可以使用boost庫的情況下,就不要使用auto_ptr,容易出現錯誤

2、如果物件無需共享,則使用scoped_ptr

3、如果物件需要共享,則使用shared_ptr

4、如果需要訪問shared_ptr物件,而又不要改變其引用計數的情況下,則使用weak_ptr,一般常用於軟體   框

架設計5、如果使用了智慧型指標,則在**中千萬不要出現delete關鍵字

該文章借鑑

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

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