先上**(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
11
template
<
class
t>
12
class
smartpointer
17
18
smartpointer(smartpointer& other) :
19
ptr(other.ptr)
22
23
virtual
~smartpointer()
26
27
smartpointer& operator=(smartpointer& other)
32
return
*
this
;
33
}
34
35
t& operator*()
const
38
39
t* operator->()
const
42
43
void
release()
48
}
49
50
void
reset(t* newptr)
55
}
56
57
private
:
58
59
t* 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分配的記憶體。相對於智慧型指標,使用這個兩個運算子非常容易出錯。因為它不能依賴類物件拷貝 賦值和銷毀操作的任何預設定義。預設情況下,動態分配的物件是預設初始化的。這意味著內建型別或組合型別的值將是未定義的。而類型別的...