为什么要有强弱指针引用?
class A
{
shared_ptr<B> b_ptr;
}
class B
{
shared_ptr<A> a_ptr;
}
void test()
{
shared_ptr<A> a_obj=shared_ptr<A>(new A);
shared_ptr<B> b_obj=shared_ptr<B>(new B);
a_obj->b_ptr=b_obj;
b_obj->a_ptr=a_obj;
}
由于A B循环引用,导致test结束以后 都没有被释放,内存泄漏了。
所以要将其中一个变为弱引用。
比如
class B
{
weak_ptr<A> a_ptr;
}
弱引用不增加引用计数,强引用是增加计数的。弱引用只有当原来的对象存在时才有用,所有的弱引用比如转化为强引用以后才能执行对象的功能,转换以后首先调用 ptr->get() 判断对象是不是有效的,再使用,因为很可能弱引用指向的对象已经被释放了。
enable_shared_from_this就不再说了。主要是在对象内部以自己来增加一个引用,但是这种情况只有在当前的对象本身是个智能指针对象的时候才能使用,否则执行时会报错。
什么意思?
class A :public enable_shared_from_this
{
void test_ref()
{
shared_ptr<A> a_temp=shared_from_this();
}
}
如果是
void test()
{
A a;
a.test_ref();
}
执行会报错。
void test()
{
shared_ptr<A> a_obj=shared_ptr<A> (new A)
a_obj->test_ref();
}
则不会报错。