智慧型指標(英語:smart pointer)是一種抽象的資料型別。在程式設計中,它通常是經由類模板(class template)來實做,藉由模板(template)來達成泛型,通常藉由類(class)的析構函式來達成自動釋放指標所指向的儲存器或物件。
起初在c++標準庫裡面是沒有智慧型指標的,直到c++11中才加入了shared_ptr和unique_ptr,weak_ptr。最早的智慧型指標在boost庫裡面,boost是為c++標準庫提供擴充套件的一些c++程式的總稱,由boost社群組織開發維護。
1.1 、.auto_ptr
#include
using namespace std;
templatet>
class autoptr
;templatet>
autoptr::autoptr(t* ptr)
templatet>
autoptr::autoptr(autoptr& ap)
templatet>
t* autoptr::get()
templatet>
t& autoptr::operator *()
templatet>
t* autoptr::operator ->()
由於autoptr類,當出現
autoptrap (new
int);
autoptrap1(ap);
*ap=100;//程式崩潰
那如何解決這個問題呢:我們的思路是,當賦值或者拷貝建構函式時,我們保持兩個指標指向同一塊記憶體空間,唯一的區別就是,我們新增乙個bool _owner來區別誰是真正的擁有者。這樣的話,指向同一塊空間,但析構時卻不會出錯。
1.2 、autoptr
template
class autoptrowner
}//拷貝建構函式
autoptrowner(autoptrowner& ap)// 一定要傳入模板引數
:_ptr(ap._ptr)
, _owner(true)
ap._owner = false;
}//賦值函式
autoptrowner& operator =(autoptrowner&ap) //返回值也應該加模板引數
_ptr = ap._ptr;
ap._owner = false;
_ptr = true;
}return *this;
}~autoptrowner()
}private:
t* _ptr;
bool _owner;
};
2.scoped_ptr
auto_ptr的行為與真正的指標有很大區別,尤其是許可權轉移這種方法,為了防止拷貝、賦值帶來的問題,所以scoped_ptr從根本上就不允許拷貝、賦值(防拷貝、防賦值)』
template
t>
class
scopedptr
;templatet>
scopedptr
::scopedptr
(t* ptr)
:_ptr(ptr)
templatet>
t*scopedptr
::get
()const
templatet>
t* scopedptr
:: operator ->() //有特殊處理
templatet>
t& scopedptr
:: operator *()
templatet>
scopedptr
:: ~scopedptr
()templatet>
void scopedptr
:: swap
(scopedptr
&ap)
templatet>
void reset
(t*p = 0)
3.shared_ptr
shared_ptr允許拷貝和賦值,其底層實現是以「引用計數」為基礎的,通過引用指標來控制空間的釋放,當shared_ptr被建立時引用計數為1,當有新的指標指向這塊空間時,引用計數加1,反之減1,直到引用計數減為0時才真的釋放這塊空間。所以說shared_ptr更像乙個指標。
template
class shareptr
}//賦值函式
//存在空間位址可能進行交換
//分三種情況:1.原有空間為null
//2.原有空間獨佔一塊記憶體-》釋放
//3.共享
shareptr& operator=(shareptr&sp)
realease();
_ptr = sp._ptr;
_pcount = sp._pcount;
(*sp._pcount)++;
}return *this;
}//析構函式
~shareptr()
destory()(_ptr);
*_pcount = 0;
}private:
//經過編寫發現賦值和析構函式的**有重複部分
//包裝成函式,提公升**復用
void release()
}private:
t* _ptr;
int *_pcount;
};//以上存在問題,對於檔案指標和 malloc 的空間就會無法使用
//不符合對應原則
//如何解決
//2.模板類
///3.特化
//釋放空間
template
class delete
};class fclose
};//int *p = (int*)malloc(sizeof(int)* 3);
template
class free
};
模擬實現c 標準庫和boost庫中的智慧型指標
我們知道c 標準庫中定義了智慧型指標auto ptr,但是我們很少用它,因為雖然它能夠自動 動態開闢的記憶體,不需要程式設計師自己去維護動態開闢的記憶體,但是當用它去賦值或者是拷貝構造時有乙個管理權轉移的過程,這樣我們就不能很方便的使用auto ptr。下面是簡單的auto ptr的實現,我們可以看...
模擬實現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....
模擬實現智慧型指標
智慧型指標可以用來管理資源,原自構造析構函式 raii 還可以像原生指標一樣使用。auto ptr 管理許可權的轉移。scoped ptr 防拷貝。shared ptr 引用計數解決auto ptr的缺陷。其中shared 自身帶有一定缺陷,迴圈引用,和不可釋放陣列類,檔案類等資源,幸運的是它支援定...