template<class _Ty>
class RefCnt
{
public:
_Ty* _Ptr;//指向Obj
std::atomic_int _User;//对应shared_ptr
std::atomic_int _Weaks;//对应weak_ptr
public:
RefCnt(_Ty*p):mptr(p),_User(1),_Weaks(1){}
~RefCnt(){}
void _Incref()
{
_User += 1;
}
void _Incwref()
{
_Weaks += 1;
}
};
template<class _Ty, class _Dx = MyDeletor<_Ty>>
class my_shared_ptr
{
private:
_Ty* _Ptr;//Object
RefCnt<_Ty>* _Ref;
_Dx _mDeletor;
public:
my_shared_ptr(_TY* p = NULL) :_Ptr(NULL), _Rep(NULL)
{
if (p != NULL)
{
_Ptr = p;
_Rep = new RefCnt<_Ty>(p);
}
}
};
class Object
{
private:
int value;
public:
Object(int x = 0) :value(x)
{
cout << "Pbject" << endl;
}
void Print()const
{
cout << "value:" << value << endl;
}
};
int main()
{
my_shared_ptr<Object>op1(new Object(10));
return 0;
}
对象内存分布图:
弱引用智能指针图解:
当为强引用时所引发的问题
class Child;
class Parent
{
public:
my_shared_ptr<Child> c;
public:
Parent()
{
cout << "Parent" << endl;
}
~Parent()
{
cout << "~Parent" << endl;
}
void hi()const
{
cout << "hello parent" << endl;
}
};
class Child
{
public:
my_shared_ptr<Parent>p;
Child()
{
cout << "Child" << endl;
}
~Child()
{
cout << "~Child" << endl;
}
};
void fun()
{
my_shared_ptr<Parent>parent(new Parent());
my_shared_ptr<Child> child(new Child());
parent->c = child;
child->p = parent;
child->p.lock()->hi();
}
图解:
改为弱引用后
class Child;
class Parent
{
public:
my_weak_ptr<Child> c;
public:
Parent()
{
cout << "Parent" << endl;
}
~Parent()
{
cout << "~Parent" << endl;
}
void hi()const
{
cout << "hello parent" << endl;
}
};
class Child
{
public:
my_weak_ptr<Parent>p;
Child()
{
cout << "Child" << endl;
}
~Child()
{
cout << "~Child" << endl;
}
};
void fun()
{
my_shared_ptr<Parent>parent(new Parent());
my_shared_ptr<Child> child(new Child());
parent->c = child;
child->p = parent;
child->p.lock()->hi();
}
图解: