C 記憶體管理神器之模板化的智慧型指標

2021-05-23 10:25:47 字數 3140 閱讀 6877

先上**(mingw下編譯測試通過):

c++標準類庫裡面有實現智慧型指標auto_ptr,位於標頭檔案。

01/*

02* smartpointer.h

03*

04*  created on: 2010-10-27

05*      author: layzerar

06*/

07

08#ifndef __smartpointer_h_include__

09#define __smartpointer_h_include__

10

11template<classt>

12classsmartpointer

17

18smartpointer(smartpointer& other) :

19ptr(other.ptr)

22

23virtual~smartpointer()

26

27smartpointer& operator=(smartpointer& other)

32return*this;

33}

34

35t& operator*()const

38

39t* operator->()const

42

43voidrelease()

48}

49

50voidreset(t* newptr)

55}

56

57private:

58

59t* ptr;

60};

61

62#endif /* __smartpointer_h_include__ */

概述:我們經常為c++的記憶體管理叫苦不迭,簡單的**還好,稍微複雜一點,可能就會忘記delete掉new出來的物件,這樣就造成了記憶體洩漏,多次delete可能會使程式崩潰。

為什麼說模板化的智慧型指標是c++記憶體管理的神器呢?

首先,我們必須改變**風格:不再返回指標object*,取而代之用smartpointer(非指標、非引用),並且在該模板類的例項裡面儲存有我們需要的指標object*。

那麼我們來看一下:

smartpointer類裡面過載了解引用操作符,這意味著,我們可以直接用smartpointer類的例項(obj->func(),*(obj).func())來訪問object的公有成員;

由於我們返回的smartpointer並非是new出來的物件,所以當該變數超出了作業範圍時,會根據析構函式(在析構函式中呼叫release()方法,這裡我們定義了smartpointer指向的object*的析構規則)來析構本物件和期指向的物件,這意味著,我們即使忘了了呼叫delete也沒關係,因為他會object*指向的例項會跟隨這smartpointer變數一起被析構,多美妙啊;

在效能需求下,我們還可以呼叫release()方法主動析構掉object*;

另外,由於這個smartpointer經過了模板化,所以幾乎可以適用與任何類的指標,只增加少量的**,就輕鬆方便的實現了c++記憶體管理。

c 智慧型指標與記憶體管理

c 中當我們需要新分配記憶體的時候需要手動的去呼叫new顯式的分配一塊記憶體,如果我們在任何中new 如函式中申請空間返回 忘記釋放,或者在 函式執行過程中出現異常,沒 有執行釋放語句 了空間,在不需要使用後忘記了呼叫delete這塊位址的話就會造成 記憶體洩露。為了解決這乙個問題引入了智慧型指標。...

C 之智慧型指標類模板

1 現代c 開發庫中最重要的類模板之一 2 c 中自動記憶體管理的主要手段 3 能夠在很大程度上避開記憶體相關的問題。1 生命週期結束時,銷毀指向的記憶體空間 2 不能指向堆陣列,只能指向堆物件 變數 3 一片堆空間只屬於乙個智慧型指標物件 4 多個智慧型指標物件不能指向同一片堆空間。例項分析1 i...

c 之智慧型指標(二)之直接管理記憶體

c 定義了兩個運算子來分配和釋放動態記憶體。new分配記憶體,delete釋放new分配的記憶體。相對於智慧型指標,使用這個兩個運算子非常容易出錯。因為它不能依賴類物件拷貝 賦值和銷毀操作的任何預設定義。預設情況下,動態分配的物件是預設初始化的。這意味著內建型別或組合型別的值將是未定義的。而類型別的...