代码拉取完成,页面将自动刷新
Counter类
Counter对象的目地就是用来申请一个块内存来存引用计数。shareCount是SharedPtr的引用计数,weakCount是弱引用计数。
当shareCount为0时,删除T*对象。
当weakCount为0同时shareCount为0时,删除Counter*对象。
Counter实现如下:
class Counter
{
public:
int shareCount = 0;
int weakCount = 0;
};
SharedPtr类
主要的成员函数包括:
默认构造函数
参数为T*的explicit单参数构造函数
参数为WeakPtr&的explicit单参数构造函数
拷贝构造函数
拷贝赋值函数
析构函数
隐式类型转换操作符 operator bool ()
operator -> ()
operator * ()
SharedPtr实现如下:
template<class T> class WeakPtr;
template<class T> class SharedPtr
{
public:
friend class WeakPtr<T>; //方便weak_ptr与share_ptr设置引用计数和赋值。
SharedPtr()
: m_pResource(nullptr)
, m_pCounter(new Counter())
{
m_pCounter->shareCount = 1;
}
explicit SharedPtr(T* pResource = nullptr)
: m_pResource(pResource)
, m_pCounter(new Counter())
{
m_pCounter->shareCount = 1;
}
SharedPtr(const WeakPtr<T>& other) // 供WeakPtr的lock()使用
: m_pResource(other.m_pResource)
, m_pCounter(other.m_pCounter)
{
if (0 == m_pCounter->shareCount) m_pResource = nullptr;
}
SharedPtr(const SharedPtr<T>& other)
: m_pResource(other->m_pResource)
, m_pCounter(other->m_pCounter)
{
++(m_pCounter->shareCount); // 增加引用计数
}
SharedPtr<T>& operator = (const SharedPtr<T>& other)
{
if (this == &other) return *this;
release();
m_pCounter = other.m_pCounter;
m_pResource = other.m_pResource;
++(m_pCounter->shareCount); // 增加引用计数
return *this;
}
~SharedPtr()
{
release();
}
T& operator bool()
{
return m_pResource != nullptr;
}
T& operator * ()
{
// 如果nullptr == m_pResource,抛出异常
return *m_pResource;
}
T* operator -> ()
{
return m_pResource;
}
private:
void release()
{
// T*肯定由SharedPtr释放,Counter*如果没有WeakPtr,也由SharedPtr释放
--m_pCounter->shareCount;
if (0 == m_pCounter->shareCount)
{
delete m_pResource;
m_pResource = nullptr;
if (0 == m_pCounter->weakCount)
{
delete m_pCounter;
m_pCounter = NULL;
}
}
}
public:
T* m_pResource = nullptr;
Counter* m_pCounter = nullptr;
};
WeakPtr类
主要的成员函数包括:
默认构造函数
参数为SharedPtr&的explicit单参数构造函数
拷贝构造函数
拷贝赋值函数
析构函数
lock()函数:取指向的SharePtr,如果未指向任何SharePtr,或者已被析构,返回指向nullptr的SharePtr
expired()函数:是否指向SharePtr,如果指向Share Ptr其是否已经析构
release()函数
WeakPtr实现如下:
template<class T> class WeakPtr
{
public:
friend class SharedPtr<T>;//方便weak_ptr与share_ptr设置引用计数和赋值。
WeakPtr()
m_pResource(nullptr)
, m_pCounter(new Counter())
{
m_pCounter->weakCount = 1;
}
WeakPtr(SharedPtr<T>& other)
: m_pResource(other.m_pResource)
, m_pCounter(other.m_pCounter)
{
++(m_pCounter->weakCount);
}
WeakPtr(WeakPtr<T>& other)
: m_pResource(other.m_pResource)
, m_pCounter(other.m_pCounter)
{
++(m_pCounter->weakCount);
}
WeakPtr<T>& operator = (WeakPtr<T>& other)
{
if (this == &other) return *this;
release();
m_pCounter = other.m_pCounter;
m_pResource = other.m_pResource;
++m_pCounter->weakCount;
return *this;
}
WeakPtr<T>& operator =(SharedPtr<T>& other)
{
release();
m_pCounter = other.m_pCounter;
m_pResource = other.m_pCounter;
++m_pCounter->weakCount; // 增加弱引用计数
return *this;
}
~WeakPtr()
{
release();
}
SharedPtr<T> lock()
{
return SharedPtr<T>(*this);
}
bool expired()
{
if (m_pCounter != nullptr && m_pCounter->shareCount != 0)
return false;
return true;
}
private:
void release()
{
--m_pCounter->weakCount;
if (0 == m_pCounter->weakCount && 0 == m_pCounter->shareCount) // 必须都为0才能删除
{
delete m_pCounter;
m_pCounter = NULL;
}
}
private:
T* m_pResource; // 可能会成为悬挂指针
Counter* m_pCounter;
};
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。