1.引入
int main()
在上面的**中定義了乙個裸指標p,需要我們手動釋放。如果我們一不小心忘記釋放這個指標或者在釋放這個指標之前,發生一些異常,會造成嚴重的後果(記憶體洩露)。而智慧型指標也致力於解決這種問題,使程式設計師專注於指標的使用而把記憶體管理交給智慧型指標。
普通指標也容易出現指標懸掛問題,當有多個指標指向同乙個物件的時候,如果某乙個指標delete了這個物件,所以這個指標不會對這個物件進行操作,那麼其他指向這個物件的指標呢?還在等待已經被刪除的基礎物件並隨時準備對它進行操作。於是懸垂指標就形成了,程式崩潰也「指日可待」。
int main()
輸出結果
222
-572662307
輸出的結果*p2的結果並不是期待中2,因為2早已經被刪除了。
智慧型指標
智慧型指標是乙個類,它把普通指標封裝起來,能實現和普通指標同樣的功能。不同的是智慧型指標能夠對記憶體進行自動管理,利用類物件出了作用域會呼叫析構函式,把對指標的釋放寫在析構函式中,避免出現懸掛指標的情況。
智慧型指標(smart pointer)是儲存指向動態分配(堆)物件指標的類,用於生存期控制,能夠確保自動正確的銷毀動態分配的物件,防止記憶體洩露。它的一種通用實現技術是使用引用計數(reference count)。智慧型指標類將乙個計數器與類指向的物件相關聯,引用計數跟蹤該類有多少個物件共享同一指標。每次建立類的新物件時,初始化指標並將引用計數置為1;當物件作為另一物件的副本而建立時,拷貝建構函式拷貝指標並增加與之相應的引用計數;對乙個物件進行賦值時,賦值操作符減少左運算元所指物件的引用計數(如果引用計數為減至0,則刪除物件),並增加右運算元所指物件的引用計數;呼叫析構函式時,建構函式減少引用計數(如果引用計數減至0,則刪除基礎物件)。
智慧型指標就是模擬指標動作的類。所有的智慧型指標都會過載 -> 和 * 操作符。智慧型指標還有許多其他功能,比較有用的是自動銷毀。這主要是利用棧物件的有限作用域以及臨時物件(有限作用域實現)析構函式釋放記憶體。當然,智慧型指標還不止這些,還包括複製時可以修改源物件等。智慧型指標根據需求不同,設計也不同(寫時複製,賦值即釋放物件擁有許可權、引用計數等,控制權轉移等)。auto_ptr 即是一種常見的智慧型指標。
智慧型指標的實現(用類模板實現)
class test
~csmartptr()
void relase() const
t& operator*()
const t& operator*()const
t *operator->()
const t *operator->()const
private:
t *_ptr;
};int main()
模擬實現auto_ptr
template
class csmartptr
~csmartptr()
}void relase() const
t& operator*()
const t& operator*()const
t *operator->()
const t *operator->()const
private:
t *_ptr;
bool owns; //標誌位 ,控制乙個資源的訪問許可權
};int main()
帶有引用計數的智慧型指標(方便對資源的管理和釋放)
class cheaptable
//增加引用計數
void addref(void *ptr)}}
//獲取引用計數的
int getref(void *ptr)
return
0; }
private:
cheaptable(){}
static cheaptable mheaptable;
struct node
bool
operator==(const node &src)
void *mpaddr; //標識堆記憶體資源
int mcount; //標識資源的引用計數
};list
mlist;
};cheaptable cheaptable::mheaptable;
template
class csmartptr
}~csmartptr()
}csmartptr(const csmartptr&src)
:mptr(src.mptr)
}csmartptr& operator=(const csmartptr&src)
mptr = src.mptr;
if(mptr != null)
}t& operator*()
const t& operator*()const
t* operator->()
const t* operator->()const
void addref()
void delref()
int getref()
private:
t *mptr;
static cheaptable &mheaptable;
};template
cheaptable& csmartptr::mheaptable = cheaptable::getinstance();
模擬實現智慧型指標
智慧型指標可以用來管理資源,原自構造析構函式 raii 還可以像原生指標一樣使用。auto ptr 管理許可權的轉移。scoped ptr 防拷貝。shared ptr 引用計數解決auto ptr的缺陷。其中shared 自身帶有一定缺陷,迴圈引用,和不可釋放陣列類,檔案類等資源,幸運的是它支援定...
模擬實現智慧型指標SharedPtr
首先我們先來乙個小小的區分三個智慧型指標 1,autoptr 管理權的轉移 嚴重缺陷,盡量不要使用 2,scopedptr 簡單粗暴 防拷貝 只宣告不定義 3,sharedptr 共享,引用計數,功能強大,迴圈引用,但是較為複雜 下面我們來模擬實現一下sharedptr template t cla...
模擬實現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....