c 智慧型指標的問題 智慧型指標初探(一)

2021-10-17 08:03:35 字數 1036 閱讀 3053

為什麼要有智慧型指標

在c++中,動態記憶體的管理一般是用一對運算子完成的:new和delete。

new:在動態記憶體中為物件分配一塊空間並返回乙個指向該物件的指標。

delete:指向乙個動態獨享的指標,銷毀物件,並釋放與之關聯的記憶體。

使用new和delete動態記憶體管理經常會出現問題:忘記釋放記憶體,會造成記憶體洩漏;尚有指標引用記憶體的情況下就釋放了它,產生引用非法記憶體的指標。一塊記憶體釋放兩次等。

所以,為了更加容易(更加安全)地使用動態記憶體,引入了智慧型指標的概念。智慧型指標的行為類似常規指標,重要的區別是它負責自動釋放所指向的物件。

智慧型指標的概念

通俗的說:智慧型指標其實就是乙個類,這個類的建構函式中傳入乙個普通指標,析構函式中釋放傳入的指標。智慧型指標的類都是棧上的物件,所以當函式(或程式)結束時會自動被釋放。

stl (模板庫)一共給我們提供了四種智慧型指標:auto_ptr,unique_ptr,shared_ptr,weak_ptr。

auto_ptr是c++98提供的解決方案,c+11已將其摒棄,並提出了unique_ptr作為auto_ptr替代方案。雖然auto_ptr已被摒棄,但在實際專案中仍可使用。建議使用較新的unique_ptr,因為unique_ptr比auto_ptr更加安全,後文會詳細敘述。shared_ptr和weak_ptr則是c+11從準標準庫boost中引入的兩種智慧型指標。weak_ptr被設計為與shared_ptr共同工作,weak_ptr是為了配合shared_ptr而引入的一種智慧型指標,它更像是shared_ptr的乙個助手。

此外,boost庫還提出了boost::scoped_ptr,boost::scoped_array和boost::intrusive_ptr 等智慧型指標,雖然尚未得到c++標準採納,但是實際開發工作中可以使用。

智慧型指標的思想

當兩個指標a、b都指向同乙個物件時,a過期時刪除物件一次,b過期時刪除物件一次,所以等於刪除了同乙個物件兩次。有什麼解決辦法呢?

智慧型指標 強弱智慧型指標

在平時編寫 的時候經常會用到new來開闢空間,而我們開闢出來的空間必須得手動去delete他,但是如果程式設計師忘記去手動釋放那邊會出現乙個麻煩的問題,記憶體洩漏!或者是一塊記憶體被多個函式同時使用時,如果其中乙個函式不知道還有其他人也在使用這塊記憶體而釋放掉的話同樣也會引起程式的崩潰。引起記憶體洩...

C 智慧型指標一

資源獲得及初始化,獲得資源馬上進行初始化 是一種利用物件生命週期來控制程式資源 如記憶體 檔案句 柄 網路連線 互斥量等等 的簡單技術。在物件構造時獲取資源,接著控制對資源的訪問使之在物件的生命週期內始終保持有效,最後在物件析構的時候釋放資源。藉此,我們實際上把管理乙份資源的責任託管給了乙個物件。智...

c 智慧型指標

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