37 智慧型指標的分析

2021-09-26 20:39:41 字數 2244 閱讀 5446

1、永恆的話題

這個程式的問題在於在**的27行,每for迴圈一次,就new乙個物件,但是只用乙個指標去指向這個物件,沒釋放記憶體,但是指標馬上又指向了另一段記憶體,這就造成了記憶體洩漏。

2、深度的思考

3、智慧型指標分析(使用物件代替指標)

從結果我們可以發現,指標指向的記憶體被釋放了,不會造成記憶體洩漏。智慧型指標真的強。

分享乙個順序的程式:

4、智慧型指標的再分析經過上面的一系列研究,我們解決了上面的第一條和第二條。那如何解決第三條和第四條的需求呢?

答案是:拷貝建構函式 和 賦值操作符過載

對於 賦值操作符過載 要注意四點內容:

— 返回值型別為類引用

— 引數型別為 const 類引用

— 加 if 語句防止自賦值

— 返回類本身

所以返回值型別為 pointer 引用,引數型別為const pointer&。第一句語句防止自賦值,if (this != &obj)。然後delete mp是為了防止new第二個物件,把初始化的給delete了。mp = obj.mp; const_cast(obj).mp = null;這兩句語句和拷貝建構函式裡面是一樣的。

第四點需求只要我們不過載運算子,那麼它就沒有與這些操作符相匹配的運算子。

綜上所訴,需求全部完成。唯一的缺陷在於上面的智慧型指標只能指向test這個固定的型別,沒辦法指向其他的型別。後續學模板技術就可以指向其他的型別。

5、軍規

智慧型指標的使用軍規:只能用來指向堆空間中的物件或者變數,不能使用智慧型指標來指向棧空間中的物件或者變數。

智慧型指標分析

在我們寫 時,經常會忘記釋放掉動態開闢出來的記憶體,或者在我們的程式中,new和delete中間有如 throw goto return break 這樣引起執行流改變的語句時,就會造成沒有釋放資源,造成記憶體洩漏。void test1 t operator 注意函式返回值型別 上面說了智慧型指標是...

C 學習筆記 第37課 智慧型指標分析

include using namespace std class test intgetvalue intmain return0 執行結果 01234 解讀 沒有對p進行記憶體釋放,會導致記憶體洩漏 解決方法 智慧型指標分析 通過類物件模擬智慧型指標,只能用來指向堆空間中的物件或者變數,智慧型指...

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

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