c++程式執行時,計算機記憶體從大類上分為棧和堆,在棧上的記憶體是由系統自動分配和**的,而堆上的記憶體卻是由程式設計師手動申請和釋放的,如果程式設計師在記憶體的管理上出現失誤,輕則程式執行結果與預期有差距,重則程式直接崩潰;
棧和堆記憶體**區別
棧記憶體上的變數在過了作用域(大括號)後系統會自動**,而堆記憶體則不會。
class myclass
private:
t* _ptr;
};實現原理很簡單,利用c++的泛型程式設計,也就是模板,將指標的管理許可權移交,智慧型指標可以說相當於管家一樣。
通過建構函式smartptr(t* ptr):_ptr(ptr){},將目標指標管理的記憶體移交給私有成員_ptr。但是要smartptr具有普通指標的功能就需要其實現「*」和「->」兩個運算子的功能;「*」號,為對指標取值,返回指標所管理的物件,而在smartptr類中因為過載了「*」運算子,此時*p會return *_ptr 。又由於ptr已經賦值給_ptr,所以*ptr和*_ptr結果一樣,自然*p就和*ptr一樣的結果。
測試一下:
定義乙個mycalss類,給定乙個成員變數a;
class myclass
{public:
myclass(){cout<
{myclass* p_myclass = new myclass ;
smartptrp(p_myclass);
p->a = 100 ;
cout
start
smart start
1001f89e8
1f89e8
200smart end
end結果可以看到,在出了作用域(大括號)後,myclass的析構函式也被呼叫了。並且
p_myclass和smartptr的私有成員_ptr管理著同一片記憶體,當p超過作用域後,會呼叫smartptr的析構函式,自動delete掉_ptr管理的記憶體,也就是p_myclass管理的記憶體;
C 智慧型指標實現
1 問題的提出 先看下面的例子 class ctext ctext private int m ptr int funtext 在函式funtext 中,類的兩個物件共用了new出來的指標ptr。當函式執行開始時,呼叫兩次建構函式 退出執行時,呼叫兩次析構函式,而在第一次呼叫時已經delete pt...
智慧型指標實現C
include using namespace std template class shared ptrelse shared ptr const shared ptr ptr shared ptr operator const shared ptr ptr if this ptr this pt...
C 實現智慧型指標
c 11增加了智慧型指標 shared ptr unique ptr weak ptr 為了加深理解,自己實現智慧型指標 我們都知道shared ptr的核心思想通過引用計數來管理記憶體 先實現單個指標的自我管理,看下面 template class ref ref t p m ptr p ref ...