首先我們先來乙個小小的區分三個智慧型指標
1,autoptr:管理權的轉移(嚴重缺陷,盡量不要使用)
2,scopedptr: 簡單粗暴—防拷貝(只宣告不定義)
3,sharedptr:共享,引用計數,功能強大,迴圈引用,但是較為複雜
下面我們來模擬實現一下sharedptr
template
t>
class
sharedptr
inline void release
()
}t &operator*()
t*operator->()
sharedptr
(const
sharedptr
& sp)
:_ptr(sp._ptr)
, _refcount(sp._refcount)
sharedptr
&operator=(const
sharedptr
&sp)
return *this;
}protected:
t*_ptr;
t*_refcount;
};
這是我們初步模擬實現的sharedptr
我們簡單分析一下下面這段複製運算子的過載
複製運算子過載分為三種情況
1,自己給自己賦值。
2,兩個物件管理同一空間。
3,兩個物件管理不同空間。
其中1,2可以歸納為一類:都是管理同一空間
sharedptr&operator=(const sharedptr&sp)
return *this;
}
但是在這裡有乙個問題:如果我們要實現
sharedptrsp1
string[20]>
我們可以實現嗎?
我們知道在c++中malloc/free,new/delete,new[ ]/delete[ ],fopen/fclose這些都是要成對出現的
我們來看一下delete與delete[ ]的區別
所以我們malloc/free,new/delete,new[ ]/delete[ ],fopen/fclose這些一定要成對出現,否則會造成不必要的麻煩
那麼我們要解決這個問題,就引入了乙個新的函式—仿函式。
仿函式的概念:仿函式(functor),就是使乙個類的使用看上去象乙個函式。其實現就是類中實現乙個operator(),這個類就有了類似函式的行為,就是乙個仿函式類了。
它是怎麼應用的呢?
在c++裡,我們通過在乙個類中過載括號運算子的方法使用乙個函式物件而不是乙個普通函式。
我們先來簡單的看乙個小例子介紹一下
template
struct less
};template
t>
class
delete
};template
t,class
del>
class
sharedptr
inline void release
()
}t &operator*()
t*operator->()
sharedptr
(const
sharedptr
& sp)
:_ptr(sp._ptr)
, _refcount(sp._refcount)
sharedptr
&operator=(const
sharedptr
&sp)
return *this;
}protected:
t*_ptr;
t*_refcount;
t _del;
};
這樣寫出來我們就可以釋放開闢的陣列記憶體了
寫的時候一定要像下面的一樣,把預設引數寫全
sharedptrsp2
string[20]>>
先說一下sharedptr是我們自己模擬實現的,庫裡面自己的命名是shared_ptr
那麼shared_ptr的迴圈引用問題是要配合weak_ptr配合解決的
下面我們總結一下庫裡面:
1,auto_ptr:管理權的轉移(帶有缺陷的設計)—–c++93/03
2,scoped_ptr(boost),unique_ptr(c++11): 防拷貝(只宣告不定義)—–簡單粗暴的設計——功能不全
3,shared_ptr(boost/c++11):引用計數—–功能強大(支援拷貝,支援定製刪除器)——缺點:迴圈引用。
注:boost是我們的第三方庫具體請了解
模擬實現智慧型指標
智慧型指標可以用來管理資源,原自構造析構函式 raii 還可以像原生指標一樣使用。auto ptr 管理許可權的轉移。scoped ptr 防拷貝。shared ptr 引用計數解決auto ptr的缺陷。其中shared 自身帶有一定缺陷,迴圈引用,和不可釋放陣列類,檔案類等資源,幸運的是它支援定...
智慧型指標的模擬實現
1.引入 int main 在上面的 中定義了乙個裸指標p,需要我們手動釋放。如果我們一不小心忘記釋放這個指標或者在釋放這個指標之前,發生一些異常,會造成嚴重的後果 記憶體洩露 而智慧型指標也致力於解決這種問題,使程式設計師專注於指標的使用而把記憶體管理交給智慧型指標。普通指標也容易出現指標懸掛問題...
模擬實現boost庫里的智慧型指標
include include using namespace std 模擬實現auto ptr,非常坑爹什麼情況下都不要使用 template class auto ptr auto ptr auto ptr a 拷貝建構函式 auto ptr operator auto ptr a ptr a....