模擬實現Boost庫中的智慧型指標 上

2021-07-29 20:10:02 字數 3064 閱讀 9301

智慧型指標(英語: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 自身帶有一定缺陷,迴圈引用,和不可釋放陣列類,檔案類等資源,幸運的是它支援定...