c 智慧型指標基礎詳解

2022-09-25 03:27:12 字數 1948 閱讀 1560

在現代 c++ 程式設計中,標準庫包含了智慧型指標(smart pointers)。

智慧型指標用來確保程式不會出現記憶體和資源的洩漏,並且是"異常安全"(exception-safe)的。

智慧型指標定義在標頭檔案 memory 裡的命名空間 std 中。它對於資源獲取即初始化(raii, resource acquisition is initialization) 程式設計理念至關重要。該理念的目的是保證物件初始化的時候也是資源獲取的時候,從而使物件的所有資源在單行**中建立。

實踐中,raii 的主要原則就是把任何在堆上分配的資源(比如動態分配的記憶體或者系統物件的處理)的所有權提供給在棧上分配的物件(其析構函式包含釋放資源及相關清理的**)。

大多數時候,當你初始化乙個原始指標或者資源控制代碼使其指向實際的資源時,立即將其傳給智慧型指標。

在現代 c++ 中,原始指標只用於包含在區域性作用域,迴圈或者工具函式的小塊**中(對效能有要求,並且對資源的所有權也不容易混淆)。

原始指標和智慧型指標的宣告比較如下:

void userawpointer()

void usesmartpointer()

// song2 is deleted automatically here.

如上所示,智慧型指標是乙個在棧上宣告的類模板,並由指向分配在堆上的物件的原始指標初始化。當智慧型指標初始化後,它就擁有了原始指標的所有權。這意味著智慧型指標需要負責原始指標指向的記憶體釋放。智慧型指標的析構函式包含了 delete 的呼叫,並且由於智慧型指標是在棧上宣告的,其析構函式會在智慧型指標物件離開作用域時被呼叫,即使在棧中發生了異常。

通過使用指標運算子(-> 和 *)訪問被封裝的指標,智慧型指標類過載了這些運算子以返回被封裝的原始指標。

c++ 智慧型指標的理念類似於在 c# 語言中建立物件的過程:建立物件後讓系統負責在正確的時間將其刪除。不同之處在於,沒有獨立的垃圾**器執行於後台;記憶體是按照標準 c++ 規範對記憶體進行管理的,使執行時環境更加快速和高效。

[!重要]

總是在單獨的行上建立智慧型指標,而不是在引數列表中,從而避免由於特定的引數列表分配規則出現一些輕微的記憶體洩漏

以下示例顯示了 c++ 標準庫中的 unique_ptr 是如何封裝指向大型物件的指標的。

class largeobject

};void processlargeobject(const largeobject& lo){}

void smartpointerdemo()

//plarge is deleted automatically when 程式設計客棧function block goes out of scope.

上述示例演示了使用智慧型指標的關鍵步驟:

智慧型指標在設計上兼顧了記憶體和效能的高效性。例如,unique_ptr 唯一的資料成員是被封裝的原始指標,這意味著 unique_ptr 具有原始指標同樣地大小,4 位元組或者 8 位元組。通過智慧型指標過載的操作符 -> 和 * 來訪問並不比直接使用原始指標來訪問慢多少。

智慧型指標有其自己的成員函式,通過 . 來訪問。例如,一些 c++ 標準庫的智慧型指標有用於重置的成員函式來釋放對原始指標的所有權。這可以用於在智慧型指標超出作用域前釋放智慧型指標管理的記憶體,看下面的示例:

void smartpointerdemo2()

智慧型指標通常提供了獲取原始指標的方式。 c++ 標準庫中的智慧型指標包含了成員函式 get 來獲取原fqsldqealz始指標。 ccomptr 有公共的類成員 p。通過獲取原始指標,你能夠使用智慧型指標來管理你自己**涉及的記憶體並依然能夠將原始指標傳遞給不支援智慧型指標的**。

void smartpointerdemo4()

以下部分總結了在 windows 環境下不同種類的智慧型指標,以及如何使用它們。

優先使用下列智慧型指標來封裝原始指標指向的純舊物件(plain old c++ objects,poco):

unique_ptr

shared_ptr

weak_ptr

microsoft docs (

C 智慧型指標詳解

自c 11起,c 標準提供兩大型別的智慧型指標 1.class shared ptr實現共享式擁有 shared ownership 概念。多個智慧型指標可以指向相同物件,該物件和其相關資源會在 最後乙個引用 reference 被銷毀 時候釋放。為了在結構複雜的情境中執行上述工作,標準庫提供了we...

c 基礎 智慧型指標

設計原理 將基本型別指標封裝為類物件指標 這個類肯定是個模板,以適應不同基本型別的需求 並在析構函式裡編寫delete語句刪除指標指向的記憶體空間。auto ptr 則c 會把m example所指向的記憶體 使m example1 的值為null,所以在c 中,應絕對避免把auto ptr放到容器...

智慧型指標詳解

智慧型指標就是用乙個類來封裝乙個指標 主要負責自動的來釋放記憶體,防止發生記憶體洩漏 智慧型指標中儲存的是指向動態物件的指標,用於動態物件生存週期的控制,能夠確保自動且正確的銷毀動態物件,防止記憶體洩漏。智慧型指標的主要作用就是利用棧智慧型指標離開作用域的時候呼叫析構函式釋放資源。下面我們介紹四類智...