- 实现一个智能指 https://github.com/chenshuo/recipes/blob/master/string/StringTrivial.h
//智能指针shared_ptr代码实现
template<typename T>
class SharePtr
{
public:
SharePtr(): m_ptr(nullptr), m_count(new size_t(0)) {}
SharePtr(T* t = nullptr): m_ptr(t), m_count(new size_t)
{
if (m_ptr == nullptr) m_count = 0;
else m_count = 1;
}
//拷贝构造函数
SharePtr(const SharePtr& p): m_ptr(p.m_ptr), m_count(p.m_count)
{
if (m_ptr != nullptr) ++(*m_count);
}
//拷贝赋值运算
SharePtr& operator=(const SharePtr& p)
{
if (m_ptr != p.m_ptr)
{
if (m_ptr != nullptr && --(*m_count) == 0)
{
delete m_ptr;
delete m_count;
m_ptr = nullptr;
m_count = nullptr;
}
m_ptr = p.m_ptr;
m_count = p.m_count;
if (m_ptr != nullptr) ++(*m_count);
}
return *this;
}
T& operator*()
{
return *m_ptr;
}
T* operator->()
{
return m_ptr;
}
~SharePtr()
{
if (m_ptr != nullptr && --(*m_count) == 0)
{
delete m_ptr;
delete m_count;
m_ptr = nullptr;
m_count = nullptr;
}
}
private:
T* m_ptr;
size_t* m_count;
};
#include<iostream>
template <typename T>
class SmartPtr;
template <typename T>
class U_ptr
{
private:
friend class SmartPtr<T>;
U_ptr(T* ptr) : p(ptr), count(1) {}
~U_ptr() {delete p;}
T* p;
int count;
};
template <typename T>
class SmartPtr
{
public:
SmartPtr(T* ptr) : rp(new U_ptr<T>(ptr)) {}
SmartPtr(const SmartPtr<T>& sp) : rp(sp.rp) {++rp->count;}
SmartPtr& operator=(const SmartPtr<T>& rhs)
{
++rhs.rp->count;
if(--rp->count == 0)
delete rp;
rp = rhs.rp;
return *this;
}
T& operator*()
{
return *(rp->p);
}
T* operator->()
{
return rp->p;
}
~SmartPtr()
{
if (--rp->count == 0)
delete rp;
}
private:
U_ptr<T>* rp;
};
- 环形引用问题举例
//环行引用
class Node
{
public:
Node()
{
cout << "Node()" << endl;
}
~Node()
{
cout << "~Node()" << endl;
}
private:
shared_ptr<Node> m_pre;
shared_ptr<Node> m_next;
};
int main()
{
share_ptr<Node> p1(new Node());
share_ptr<Node> p2(new Node());
p1->m_next = p2;
p2->m_pre = p1;
}