2 Star 4 Fork 1

零声社区/一线互联网大厂社招面试题解析归纳整理-持续更新

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
3.6 C++ 智能指针shared_ptr、weak_ptr的实现. 4.25 KB
一键复制 编辑 原始数据 按行查看 历史
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;
};
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/zero-sound-community/interview-question-bank.git
git@gitee.com:zero-sound-community/interview-question-bank.git
zero-sound-community
interview-question-bank
一线互联网大厂社招面试题解析归纳整理-持续更新
master

搜索帮助