C++面试题目_智能指针

什么是智能指针?

Cpp没有内存回收机制,new对应着delete,很容易出现内存泄漏,所以Cpp 98推出了智能指针回收机制,来弥补Cpp内存管理上的技术空白。

 智能指针把一个普通的指针将封装成栈对象,当栈对象的生成周期结束后,对象就会在自动在析构函数中释放掉申请的内存,防止内存泄露。
  1. auto_ptr

    C++引入,在头文件中,在使用auto_ptr对象销毁时,他管理的对象也会自动被删除掉。
    但是auto_ptr存在安全问题,如下所示:

    auto_ptr<string> str( new string(“I am handsome boy”) );
    auto_ptr<string> vocation;
    vocation = ps;
    
  2. unique_ptr

    两个auto_ptr如果指向了同一个内存地址,如果两个auto_ptr同时释放,那么就会出现内存泄露的问题。所以引入了unique指针,unique指针禁止对象的复制,如果出现了两个指针进行复制的情况,就会出现编译错误。但是可以使用move()函数来进行控制权限的转移。

    unique<string> ptr1(new string(“I am handsome boy!”));
    unique<string>ptr2 = ptr1                        ///提示编译错误;
    unique<string>ptr3(ptr1);                        ///提示编译出错
    
    auto_ptr<string> str( new string(“I am handsome boy”) );
    auto_ptr<string> vocation=ps;                   ///编译通过
    
    unique<string> ptr4 = move(ptr1);               ///编译通过
                                                    ///使用move函数来进行权限的转移
    
  3. shared_ptr

    Shared_ptr是引用计数的指针,当有一个新的对象指向一个内存时,他的计数count就会加一。当时最后一个指针调用析构函数的时候,就会释放该内存。

    .use_count()       ///查询引用计数
    .reset()           ///重新设置
    .make_shared( )    ///函数传入普通指针
    .get( )            ///可以获得函数获得指针
    
  4. weak_ptr

    weak_ptr 是一种不控制对象生命周期的智能指针, 它指向一个 shared_ptr 管理的对象。 进行该对象的内存管理的是那个强引用的shared_ptr,weak_ptr只是提供了对管理对象的一个访问手段。

    weak_ptr 设计的目的是为配合 shared_ptr 而引入的一种智能指针来协助 shared_ptr 工作, 它只可以从一个 shared_ptr 或另一个 weak_ptr 对象构造,它的构造和析构不会引起引用记数的增加或减少。

    weak_ptr是用来解决shared_ptr相互引用时的死锁问题,如果说两个shared_ptr相互引用,那么这两个指针的引用计数永远不可能下降为0,资源永远不会释放。它是对对象的一种弱引用,不会增加对象的引用计数,和shared_ptr之间可以相互转化,shared_ptr可以直接赋值给它,它可以通过调用lock函数来获得shared_ptr。

    expired()    用于检测所管理的对象是否已经释放, 如果已经释放, 返回 true; 否则返回 false。
    lock()       用于获取所管理的对象的强引用(shared_ptr).
    如果 expired 为 true, 返回一个空的shared_ptr; 否则返回一个shared_ptr, 其内部对象指向与weak_ptr 相同。
    
    use_count()  返回与 shared_ptr 共享的对象的引用计数.
    reset()      将 weak_ptr 置空.
    weak_ptr     支持拷贝或赋值, 但不会影响对应的 shared_ptr 内部对象的计数.
    
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值