前言智慧型指標是行為類似於指標的類物件。
#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.智...