纯粹是个人实现,可能有错误,还请海涵。。
我只实现了基本的功能和use_count函数,实现其他像swap,reset函数并未做实现。
直接上代码吧。
这是模板类的实现
//智能指针的实现
#include<iostream>
using namespace std;
#include<memory>
template<class T>
class MyShared_ptr
{
public:
//构造函数
explicit MyShared_ptr(T *p = NULL)
{
this->m_ptr = p;
this->m_count = new size_t;
if (p == NULL)
{
*this->m_count = 0;
}
else
{
*this->m_count = 1;
}
}
//析构函数
~MyShared_ptr()
{
if (this->m_ptr)
{
if (*(--this->m_count) == 0)
{
delete this->m_ptr;
delete this->m_count;
this->m_ptr = NULL;
this->m_count = NULL;
}
}
}
//拷贝构造函数
MyShared_ptr(const MyShared_ptr& shared)
{
if (this != &shared)
{
this->m_ptr = shared.m_ptr;
this->m_count = shared.m_count;
(*this->m_count)++;
}
}
//重载赋值操作符
MyShared_ptr& operator=(const MyShared_ptr& shared)
{
if (this->m_ptr == shared.m_ptr)
{
return *this;
}
if (this->m_ptr)
{
if (*(--this->m_count) == 0)
{
delete this->m_ptr;
delete this->m_count;
this->m_ptr = NULL;
this->m_count = NULL;
}
}
this->m_ptr = shared.m_ptr;
this->m_count = shared.m_count;
(*this->m_count)++;
return *this;
}
//重载->操作符
T& operator->()
{
if (this->m_ptr)
{
return this->m_ptr;
}
}
//重载 *
T& operator*()
{
if (this->m_ptr)
{
return *(this->m_ptr);
}
}
//实现 use_count函数
size_t use_count()
{
return *this->m_count;
}
private:
T *m_ptr; //内部指针,保证拷贝指向同一内存
size_t *m_count; //为了保证指针的引用计数,这里我是用了指针来做
};
测试的代码我就放在一起了
//测试自己写的智能指针和std提供的智能指针是否相同
//测试std提供的智能指针
void Std_SharedPtr_Test()
{
shared_ptr<int>ptr(new int);
shared_ptr<int>ptr2(ptr);
shared_ptr<int> ptr3;
ptr3 = ptr2;
cout << "这是std::shared_ptr测试结果:" << endl;
cout <<"ptr.use_count:"<<ptr.use_count() << endl;
cout <<"ptr2.use_count:"<< ptr2.use_count() << endl;
cout <<"ptr3.use_count:"<< ptr3.use_count() << endl;
*ptr3 = 100;
cout << "通过对*ptr3赋值 取ptr的值为:"<<*ptr << endl;
cout << endl;
}
//测试自己的智能指针
void MyShared_Ptr_Test()
{
MyShared_ptr<int> ptr(new int);
MyShared_ptr<int> ptr2(ptr);
MyShared_ptr<int> ptr3;
ptr3 = ptr2;
cout << "这是MyShared_ptr测试结果:" << endl;
cout << "ptr.use_count:" << ptr.use_count() << endl;
cout << "ptr2.use_count:" << ptr2.use_count() << endl;
cout << "ptr3.use_count:" << ptr3.use_count() << endl;
*ptr3 = 200;
cout << "通过对*ptr3赋值 取ptr的值为:" << *ptr << endl;
}
int main()
{
Std_SharedPtr_Test();
MyShared_Ptr_Test();
system("pause");
return 0;
}
测试的结果
这是我自测结果,如有需要,自行测试。