p; return *(m_ptr);
}
//原始指针操作
T* operator->()
{
PTR_ASSERT(m_ptr != NULL);
return m_ptr;
}
operator bool() const
{
return m_ptr != NULL;
}
//取得原始指针
T* getPointer()
{
PTR_ASSERT(m_ptr != NULL);
return m_ptr;
}
//获得引用计数
int getRefCount()
{
PTR_ASSERT(m_iRefCount != NULL);
return *m_iRefCount;
}
private:
void RefCountInit()
{
m_iRefCount = new int(1);
}
void RefCountIncrease()
{
if (m_iRefCount != NULL)
{
++(*m_iRefCount);
}
}
void RefCountDecrease()
{
if (m_iRefCount != NULL && --(*m_iRefCount) == 0)
{
m_deleter(m_ptr);
delete m_iRefCount;
m_ptr = NULL;
m_iRefCount = NULL;
}
}
private:
int* m_iRefCount; //引用计数
T* m_ptr; //对象指针
deleter m_deleter; //删除器
};
_SMART_PTR_END
#endif // !__SHARE_PTR_H__
main函数测试
#include "share_ptr.h"
#include <memory>
class Test
{
public:
Test()
{
std::cout << "construct.." << std::endl;
}
void method()
{
std::cout << "welcome Test.." << std::endl;
}
~Test()
{
std::cout << "destruct.." << std::endl;
}
};
int main()
{
Test* t1 = new Test();
_SMART_PTR shared_ptr<Test> shptr(t1);
_SMART_PTR shared_ptr<Test> shptr1(shptr);
_SMART_PTR shared_ptr<Test> shptr2 = shptr1;
std::cout << "RefCount: " << shptr2.getRefCount() << std::endl;
shptr2->method();
(*shptr2).method();
if (shptr2)
{
std::cout << "ptr is exit " << std::endl;
}
return 0;
}
测试最后打印:
[linuxidc@yejy cmake-00]$ ./smartptr
construct..
RefCount: 3
welcome Test..
welcome Test..
ptr is exit
destruct..
[linuxidc@yejy cmake-00]$
shared_ptr主要需实现的功能点如下(以下总结):
1.没有参数构造的时候,初始化为空,即对象和引用计数的两个指针都为0
2.使用指针为参数构造时,拥有此指针,在没有智能指针指向它时进行析构
3.智能指针复制时,两个智能指针共同拥有内部指针,引用计数同时+1
4.智能指针可以使用智能指针或普通指针重新赋值。重载=操作符,对于智能指针赋值,需要考虑是否自赋值,以避免将自身析构了后再重新赋值,而普通指针赋值给智能指针,则不需要考虑自赋值,因为两者本身是两个类型
5.获得底层指针的访问,定义getPtrPointer()和getPtrCounter()来分别返回底层指针和引用计数,定义operator bool()来处理智能指针隐式转换为bool的情况
6.重载->和×操作符 ,来实现与普通指针相同的指针访问
7.需要支持隐式指针类型转换,static_cast不支持