Bootstrap

c++智能指针share_ptr实现

#include <iostream>
using namespace std;


template<class T>
class SmartPtr
{
public:
	SmartPtr(T* const p);
	SmartPtr(const SmartPtr<T>& orig);
	~SmartPtr();
	SmartPtr& operator=(const SmartPtr& ptr);
	T& operator*();
	T* getPointer();
	int getCount();



private:
	T* _ptr;
	int* _count;

};

template<class T>
SmartPtr<T>::SmartPtr(T* const p)
{
	_ptr = p;
	_count = new int(1);
}

template<class T>
SmartPtr<T>::SmartPtr(const SmartPtr<T>& orig)
{
	_ptr = orig._ptr;
	_count = orig._count;
	++(*_count);
}

template<class T>
SmartPtr<T>::~SmartPtr()
{
	if (--(*_count) == 0)
	{
		delete _ptr;
		delete _count;
		_ptr = nullptr;
		_count = nullptr;
		cout << "destructor!" << endl;
	}
}

template<class T>
SmartPtr<T>& SmartPtr<T>::operator=(const SmartPtr& ptr)
{
	_ptr = ptr._ptr;
	*_count = ptr._count;
}

template<class T>
T& SmartPtr<T>::operator*()
{
	return *(_ptr);
}

template<class T>
T* SmartPtr<T>::getPointer()
{
	return _ptr;
}

template<class T>
int SmartPtr<T>::getCount()
{
	return *_count;
}

int main()
{
	SmartPtr<int> sPtr(new int(10));
	cout << "Pointer address:" << sPtr.getPointer() << endl;
	cout << "value:\t\t" << *sPtr << endl;

	cout << endl;
	SmartPtr<int> sPtr1(sPtr);
	cout << "Pointer address:" << sPtr.getPointer() << endl;
	cout << "value:\t\t" << *sPtr << endl;

	cout << endl;
	++(*sPtr);
	cout << "value:\t\t" << *sPtr << endl;
	cout << "value:\t\t" << *sPtr << endl;
}
;