c 中的智慧型指標

2021-10-08 15:23:49 字數 1547 閱讀 4744

1.智慧型指標的作用:為了防止記憶體洩露的問題

c++程式設計中使用堆記憶體是非常頻繁的操作,堆記憶體的申請和釋放都由程式設計師自己管理。程式設計師自己管理堆記憶體可以提高了程式的效率,但是整體來說堆記憶體的管理是麻煩的,c++11中引入了智慧型指標的概念,方便管理堆記憶體。使用普通指標,容易造成堆記憶體洩露(忘記釋放),二次釋放,程式發生異常時記憶體洩露等問題等,使用智慧型指標能更好的管理堆記憶體。

記憶體洩露:記憶體洩漏指因為疏忽或錯誤造成程式未能釋放已經不再使用的記憶體的情況。記憶體洩漏並不是指內存在物理上的消失,而是應用程式分配某段記憶體後,因為設計錯誤,失去了對該段記憶體的控制,因而造成了記憶體的浪費。長期執行的程式出現記憶體洩漏,影響很大,如作業系統、後台服務等等,出現記憶體洩漏會導致響應越來越慢,最終卡死。

2.智慧型指標如何解決記憶體洩露:構造乙個物件,當使用智慧型指標時會自己呼叫析構函式,釋放資源避免記憶體洩露。利用的就是c++構造的物件最終會被銷毀的原則

原理:raii特性(是一種利用物件生命週期來控制程式資源(如記憶體、檔案控制代碼、網路連線、互斥量等等)的簡單技術)

過載operator*和opertaor->,具有像指標一樣的行為。

什麼是raii?

raii是resource acquisition is initialization(wiki上面翻譯成 「資源獲取就是初始化」)的簡稱,是c++語言的一種管理資源、避免洩漏的慣用法。利用的就是c++構造的物件最終會被銷毀的原則。raii的做法是使用乙個物件,在其構造時獲取對應的資源,在物件生命期內控制對資源的訪問,使之始終保持有效,最後在物件析構的時候,釋放構造時獲取的資源。

3.四種智慧型指標的具體情況:

auto_ptr指標 

auto_ptr智慧型指標的缺點:當物件拷貝或者賦值後,前面的物件就懸空了。(c++98,因為會導致野指標的問題禁止使用

呼叫了拷貝建構函式時,如果我們想要修改第一次構造出來的物件的內容時,會發現物件的資源已經被清理了,所以會導致程式崩潰。

unique_ptr指標

unique_ptr的實現原理:簡單粗暴的防拷貝,下面簡化模擬實現了乙份uniqueptr來了解它的原理

shared_ptr指標

shared_ptr的原理:通過引用計數的方式來實現多個shared_ptr物件之間共享資源。

shared_ptr在其內部,給每個資源都維護了著乙份計數,用來記錄該份資源被幾個物件共享。

在物件被銷毀時(也就是析構函式呼叫),就說明自己不使用該資源了,物件的引用計數減一。

如果引用計數是0,就說明自己是最後乙個使用該資源的物件,必須釋放該資源;

如果不是0,就說明除了自己還有其他物件在使用該份資源,不能釋放該資源,否則其他物件就成野指標了。

weak_ptr指標

weak_ptr是配合shared_ptr而引入的一種智慧型指標來協助shared_ptr工作,它可以從乙個shared_ptr或另乙個weak_ptr物件構造,它的構造和析構不會引起引用記數的增加或減少。沒有過載*和->但可以使用lock獲得乙個可用的shared_ptr物件。

C 中的智慧型指標

長久以來 c 最被人詬病的就是它的記憶體管理,寫個稍微複雜點的程式就經常會碰到記憶體洩漏問題。為了解決這個問題,c 也做了許多努力。在 c 98 標準中首先提出了智慧型指標的概念,引入了 auto ptr。但是在實踐中,auto ptr 有不少問題。因此在 c 11 標準中對原有的智慧型指標又做了進...

C 中的智慧型指標

c 中的四個智慧型指標分別是 1.shared ptr 2.unique ptr 3.weak ptr 4.auto ptr 已經被c 11棄用 在c 11的環境中會爆警告warning auto ptr is deprecated 智慧型指標的作用是管理乙個指標。因為存在以下這種情況 申請的空間在...

c 智慧型指標

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