- 一个资源可由多个对象管理
- 有多少个对象管理资源,引用计数就是几
- 会造成循环引用的问题
template <class T>
class sharedPtr{
public:
sharedPtr(T* ptr = nullptr)
:_ptr(ptr)
,_pmt(new mutex)
,_ptrCount(new int(0)){
if (_ptr){
addPtrCount();
}
cout << "构造->当前引用计数为 :" << *_ptrCount << endl;
}
void addPtrCount(){
(*_pmt).lock();
++*_ptrCount;
(*_pmt).unlock();
}
sharedPtr(sharedPtr<T>& ap)
:_ptr(ap._ptr)
, _ptrCount(ap._ptrCount)
,_pmt(ap._pmt){
if (ap._ptr)
addPtrCount();
cout << "拷贝->当前引用计数为 :" << *_ptrCount << endl;
}
sharedPtr<T>& operator=(sharedPtr<T>& ap){
if (this != &ap){
clearCount();
_ptr = ap._ptr;
_ptrCount = ap._ptrCount;
_pmt = ap._pmt;
if (ap._ptr)
addPtrCount();
}
cout << "赋值->当前引用计数为 :" << *_ptrCount << endl;
return *this;
}
sharedPtr<T>& operator*(){
return *_ptr;
}
sharedPtr<T>* operator->(){
return _ptr;
}
void clearCount(){
if (_ptr){
if (*_ptrCount == 1){
cout << "直接析构->当前引用计数为 :" << *_ptrCount << endl;
delete _ptr;
_ptr = nullptr;
}
else{
(*_pmt).lock();
cout << "析构前->当前引用计数为 :" << *_ptrCount << endl;
--*_ptrCount;
(*_pmt).unlock();
}
}
}
~sharedPtr(){
clearCount();
}
private:
T* _ptr;
int* _ptrCount;
mutex* _pmt;
};
int main(){
sharedPtr<int> sp1;
sharedPtr<int> sp2(sp1);
sharedPtr<int> sp3(new int(10));
sp1 = sp3;
sp2 = sp3;
return 0;
}