0.前言
C++11
為我們帶來了std::shared_ptr
菲茬,方便我們在動態(tài)分配內(nèi)存的時候發(fā)生memory leak来庭,他是基于引用計數(shù)實現(xiàn)的,下面給出一個簡化版本承疲。
1.實現(xiàn)
namespace smart_ptr {
class counter {
public:
counter(unsigned cnt):count_(cnt) {
}
unsigned& operator++() {
++count_;
return count_;
}
unsigned operator++(int) {
unsigned count = count_;
++count_;
return count;
}
unsigned& operator--() {
--count_;
return count_;
}
unsigned operator--(int) {
unsigned count = count_;
--count_;
return count;
}
unsigned getCount()const {
return count_;
}
private:
unsigned count_ = 0;
};
template<typename T>
class shared_ptr {
public:
using pointer=T *;
using reference=T &;
shared_ptr(pointer ptr) {
counter_ = new counter(1);
data_ = ptr;
}
~shared_ptr() {
--(*counter_);
if (counter_->getCount() == 0) {
delete data_;
data_ = nullptr;
delete counter_;
counter_ = nullptr;
}
}
shared_ptr(const shared_ptr<T>& s_ptr) {
counter_ = s_ptr.counter_;
++(*counter_);
data_ = s_ptr.data_;
}
pointer get()const {
return data_;
}
unsigned use_count()const {
return counter_->count_;
}
pointer operator->() {
return data_;
}
reference operator*() {
return *data_;
}
private:
counter* counter_;
pointer data_;
};
}
在這里我們聲明了一個類counter
專門用于計算指向動態(tài)內(nèi)存的對象數(shù)量记焊,在我們撞見shared_ptr
對象時逸月,動態(tài)分配一個內(nèi)存給成員counter_
,當(dāng)對象發(fā)生拷貝時遍膜,使用同一個counter
增加引用計數(shù)碗硬。在析構(gòu)時,我們將counter
進行自減瓢颅,如果自減后counter
為零恩尾,那么就釋放動態(tài)分配的內(nèi)存。也就是說挽懦,如果我們想要像new
操作符一樣手動析構(gòu)翰意,那么我們只需要手動調(diào)用~shared_ptr()
即可。手動調(diào)用析構(gòu)函數(shù)只是銷毀了對象信柿,并沒有釋放這段內(nèi)存冀偶。