实现
下面是我参考boost写的一个实现,与boost不同的是boost 并没有限制Shared_ptr不能在堆上申请,我这里做了一个限制。
#ifndef SMART_POINTER_SHARED_PTR
#define SMART_POINTER_SHARED_PTR
template<class T>
void checked_delete(T* del)
{
typedef char must_be_complete[(sizeof(T)? 1 : -1)];
(void)sizeof(must_be_complete);
delete del;
}
template<class T>
class SharedPtr;
template<class T>
class SharedCount {
friend class SharedPtr<T>;
protected:
SharedCount()
:count_(NULL),
data_(NULL)
{
}
SharedCount(T* data)
{
try
{
count_ = new int(1);
data_ = data;
}
catch(...)
{
checked_delete(data);
throw;
}
}
SharedCount(const SharedCount& tmp)
:count_(tmp.count_)
{
if(count_) {
__sync_fetch_and_add(count_,1);
data_ = tmp.data_;
}
}
Sh