下面是一个简化版的shared_ptr
实现,仅包含基本的引用计数和内存释放功能:
template <typename T>
class SharedPtr {
public:
SharedPtr(T* ptr = nullptr)
: m_ptr(ptr),
m_refCount(new int(1)),
m_isArray(false) {}
~SharedPtr() {
release();
}
SharedPtr(const SharedPtr& other)
: m_ptr(other.m_ptr),
m_refCount(other.m_refCount),
m_isArray(other.m_isArray) {
(*m_refCount)++;
}
SharedPtr& operator=(const SharedPtr& other) {
if (this != &other) {
release();
m_ptr = other.m_ptr;
m_refCount = other.m_refCount;
m_isArray = other.m_isArray;
(*m_refCount)++;
}
return *this;
}
T& operator*() const {
return *m_ptr;
}
T* operator->() const {
return m_ptr;
}
private:
void release() {
(*m_refCount)--;
if (*m_refCount == 0) {
if (m_isArray) {
delete[] m_ptr;
} else {
delete m_ptr;
}
delete m_refCount;
}
}
T* m_ptr;
int* m_refCount;
bool m_isArray;
};
上述代码实现了一个简化版的SharedPtr
模板类,用于管理动态内存。它包含一个指向动态内存的指针m_ptr
和一个引用计数的指针m_refCount
。引用计数使用int*
类型表示,以便记录有多少个SharedPtr
对象共享同一个指针。
在构造函数中,我们初始化指针和引用计数。在析构函数中,我们释放动态内存。在拷贝构造函数和赋值运算符中,我们更新引用计数,并确保正确处理自赋值的情况。
此外,我们还重载了*
和->
运算符,以便可以像使用指针一样访问SharedPtr
对象所管理的动态内存。
需要注意的是,上述代码仅为简化版实现,没有处理多线程安全性、自定义删除器等复杂的情况。实际上,std::shared_ptr
的实现要比上述代码复杂得多,涉及到更多的细节和考虑。因此,如果需要使用shared_ptr
,建议使用标准库提供的std::shared_ptr
,而不是自己实现。