经典面试题-----------智能指针相关

目前常用智能指针有三种: 1. shared_ptr  2. unique_ptr 3.  wake_ptr

注:(原本还有一个auto_ptr, 但是auto_ptr存在一个问题,就是虽然其不能进行拷贝和赋值,但是你这么做编译器他不会报错,这样的话有隐患,还有就是由于不能拷贝所以不能存入stl中的容器中,因为容器在扩容等操作的时候就会进行拷贝,所以不行)

1.unique_ptr 这个智能指针是通过资源独占的方式来实现防止内存泄露的,当不用该对象时,会自动调用析构函数进行内存释放.他的拷贝构造还有赋值函数都被设置为私有属性,则你调用他的拷贝和赋值会报错,这个是与auto_ptr不同的地方.如果非要赋值的话可以通过使用move()函数std::move() 当调用这个时会将原本的对象析构掉,所以还是唯一的.

2.shared_ptr 这个智能指针通过引用计数来保证不会内存泄露, 它含有一个use_count(不知道属性名是否叫这个,但是查看时方法名叫这个)被引用的个数这个属性,这个智能指针在构造的时候,将引用计数置为1, 在reset函数中将引用计数减一,每当share_ptr离开其作用范围,即被销毁时引用计数减一,在拷贝构造和赋值时将引用计数增加1,每当计数消减为0时就调用析构函数将内存释放掉

3.wake_ptr 这个智能指针是为了避免shared_ptr循环引用而无法释放内存引入的, wake_ptr是一个弱引用,他的引用计数不会影响shared_ptr的计数, 当shared_ptr计数为0时内存就会被释放,无论有没有wake_ptr的引用, 所以在使用wake_ptr时应该小心,有可能所指向的对象已经被释放,所以应该检查是否wake_ptr为空指针.

关于shared_ptr和wake_ptr之间的关系,我觉得这篇博客讲的很清楚: https://blog.csdn.net/ingvar08/article/details/79200424

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值