C++智能指针总结(面试常问)

21 篇文章 4 订阅

1.智能指针的实现原理

智能指针的实现原理就是在一个类的内部封装了类对象的指针,然后在析构函数里对我们的类对象指针进行释放,因为类的析构是在类对象生命期结束时自动调用的,这样我们就省去了手动释放内存的操作,避免忘记手动释放导致的内存泄漏。

2. C++11四种智能指针总结

2.1 auto_ptr:

1.auto_ptr以前是用在C98中,C++11被抛弃,头文件一般用来作为独占指针

2.auto_ptr被赋值或者拷贝后,失去对原指针的管理

3.auto_ptr不能管理数组指针,因为auto_ptr的内部实现中,析构函数中删除对象使用delete而不是delete[],释放内存的时候仅释放了数组的第一个元素的空间,会造成内存泄漏。

4.auto_ptr不能作为容器对象,因为STL容器中的元素经常要支持拷贝,赋值等操作。


2.2 unique_ptr:

1.C++11中用来替代auto_ptr

2.拷贝构造和赋值运算符被禁用,不能进行拷贝构造和赋值运算

3.虽然禁用了拷贝构造和赋值运算符,但unique_ptr可以作为返回值,用于从某个函数中返回动态申请内存的所有权,本质上是移动拷贝,就是使用std:move()函数,将所有权转移。


2.3 share_ptr:

  1. 多个指针可以指向相同的对象,调用release()计数-1,计数0时资源释放

  2. .use_count()查计数

  3. .reset()放弃内部所有权

  4. share_ptr多次引用同一数据会导致内存多次释放

  5. 循环引用会导致死锁,

  6. 引用计数不是原子操作。

shared_ptr 有两个数据成员,一个是指向 对象的指针 ptr,另一个是 ref_count 指针(包含vptr、use_count、weak_count、ptr等);
在这里插入图片描述

shared_ptr<Foo> x(new Foo);
shared_ptr<Foo> y = x; 

y=x 涉及两个成员的复制,这两步拷贝不会同时(原子)发生,中间步骤 1,复制 ptr 指针,中间步骤 2,复制 ref_count 指针,导致引用计数加 1
步骤一:
在这里插入图片描述步骤二:
在这里插入图片描述

因为是两步,如果没有 mutex 保护,那么在多线程里就有数据竞争。

多线程读写同一个 shared_ptr 必须加锁


2.4 weak_ptr:

1.解决两个share_ptr互相引用产生死锁,计数永远降不到0,没办法进行资源释放,造成内存泄漏的问题。

2.使用时配合share_ptr使用,把其中一个share_ptr更换为weak_ptr

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值