智慧型指標筆記

2021-10-01 17:14:53 字數 2037 閱讀 8247

前言智慧型指標是行為類似於指標的類物件。

#include

#include

using

namespace std;

void

fun(string &str)

;int

main()

system

("pause");

return0;

}void

fun(string &str)

可以看出此**中有缺陷,在fun函式中,分配了堆中的記憶體,但是從來不收回。在主函式中一直呼叫fun函式,從而導致記憶體洩漏。

解決方法,在return前記得使用delete將釋放ptr。但凡是別忘了,都有可能會忘記,還有一種情況。

將fun函式中新增一段異常處理**

void

fun(string &str)

str=

*ptr;

delete ptr;

return ;

}

當出現異常時,delete語句沒有被執行,依然造成記憶體洩露。

方法一:可以在引發異常的函式中捕獲該異常,在catch塊中包含一些清理**,然後重新引發異常。

void

fun(string &str)

}catch

(exception &ex)

str=

*ptr;

delete ptr;

return ;

}

但是,會增加疏忽和產生其他錯誤的機會。所以使用智慧型指標解決會比較優雅。

在fun函式終止時(異常終止和正常終止),本地變數從棧記憶體中刪除,ptr指標會被釋放。

為了釋放ptr所指向的記憶體,可以使ptr成為類物件,在類的析構器中釋放它所指向的記憶體,這正是auto_ptr、unique_ptr、shared_ptr的思想。

1.新增標頭檔案memory

2.將指向string的指標換成string的智慧型指標物件。

3.刪除delete

//需要新增標頭檔案 memory

void

fun(string &str)

str=

*ptr;

//delete ptr;

return ;

}

值得注意智慧型指標類的建構函式是explicit修飾的,該建構函式以指標作為引數,因此不需要自動將指標轉換為智慧型指標物件,explicit防止了隱式轉換。

1.避免程式將delete運算子用於非堆記憶體。

string a1

("abcde");

shared_ptrp(

&a1)

;

在**塊執行結束時,p過期,會呼叫delete釋放了非堆記憶體。因此造成錯誤。

2.指標之間的賦值

auto_ptrp(

new string (

"abcd"))

;auto_ptr a;

a=p;

此賦值語句中,如果p和a是常規的指標時,p和a指向同乙個string的物件,這是不能接受的,因為p過期的string物件被刪除,a過期時string物件又被刪除。解決方法:

、過載賦值運算子,使賦值時,兩個指標不是指向同乙個物件,乙個指標物件指向另乙個指標物件的副本。

、建立所有權概念(ownership),對於特定的物件,只能有乙個智慧型指向它,這樣只有擁有物件的智慧型指標的析構函式會刪除該物件。然後讓賦值操作轉讓所有權,這就是用於auto_ptr和unique_ptr的策略,當然unique_ptr更嚴格。

、建立智慧型更高指標,跟蹤特定物件的智慧型指標數(引用計數),例如,賦值時,計數加一,指標過期時,計數減一。當最後乙個指標過期時,才呼叫delete,這就是shared_ptr採用的策略。

對於智慧型指標之間的區別,以及如何讓選擇智慧型指標。下此再看…

筆記 2 智慧型指標

原生指標是一款很強大的工具,但是依據進數十年的經驗,可以確定的一點是 稍有不慎,這 個工具就會反噬它的使用者。c 11標準中規定了四個智慧型指標 std auto ptr,std unique ptr,std shared ptr,std weak ptr.他們都是用來輔助管理動態分配物件的宣告週期...

c primer筆記 智慧型指標

智慧型指標的陷阱 基本規範 1.不使用相同的內建指標值初始化 或reset 多個智慧型指標。double free 2.不delete get 返回的指標。double free 3.不使用get 初始化或reset另乙個智慧型指標。double free 4.如果你使用get 返回的指標,記住當最...

C Primer 筆記 智慧型指標

1.新的標準庫提供了兩種智慧型指標型別,shared ptr允許多個指標指向同乙個物件,unique ptr則獨佔所指的物件。標準庫還定義了乙個名為weak ptr的伴隨類,它是一種弱引用,指向shared ptr所管理的物件。2.智慧型指標也是模板,預設初始化的智慧型指標中儲存著乙個空指標。3.智...