#include <iostream>
using namespace std;
template<class T>
class smart_pointer {
private:
T* _ptr;
int* _count;
public:
smart_pointer(T* ptr = nullptr) : _ptr(ptr) {
if (_ptr) _count = new int(1);
else _count = new int(0);
}
smart_pointer(const smart_pointer* ptr) {
if (this != &ptr) {
this->_ptr = ptr._ptr;
this->_count = ptr._count;
(*this->_count)++;
}
}
smart_pointer& operator=(const smart_pointer& ptr) {
if (this->_ptr == ptr._ptr) return *this;
if (this->_ptr) {
(*this->_count)--;
if (*this->_count == 0) {
delete this->_ptr;
delete this->_count;
cout << "dealloc smartPointer" << endl;
}
}
this->_ptr = ptr._ptr;
this->_count = ptr._count;
(*this->_count)++;
return *this;
}
T& operator*() { return *(this->_ptr); }//*操作符重载,返回指针指向地址的内容
T* operator->() { return this->_ptr; }//->操作符重载,返回类型为指针
~smart_pointer() {
(*this->_count)--;
if (*this->_count == 0) {
delete this->_ptr;
delete this->_count;
}
}
int use_count() { return *this->_count; }
};
int main()
{
smart_pointer<int> ptr(new int(10));
cout << "value : " << *ptr << ". use count of ptr is : " << ptr.use_count() << endl;
smart_pointer<int> ptr1;
ptr1 = ptr;
cout << " use count of ptr is : " << ptr.use_count() << endl;
smart_pointer<int> ptr2(new int(11));
ptr1 = ptr2;
cout << " use count of ptr is : " << ptr.use_count() << endl;
ptr = ptr2;
cout << " use count of ptr is : " << ptr.use_count() << endl;
return 0;
}
输出:
可以看到析构函数被调用,自动释放资源