智能指针强弱引用以及enable_shared_from_this使用

为什么要有强弱指针引用?


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();

}

则不会报错。














  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值