ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

智能指针

2022-06-24 13:32:03  阅读:158  来源: 互联网

标签:std 指针 智能 new unique ptr delete


1.什么是智能指针

从比较简单的层面来看,智能指针是RAII(Resource Acquisition Is Initialization,资源获取即初始化)机制对普通指针进行的一层封装。这样使得智能指针的行为动作像一个指针,本质上却是一个对象,这样可以方便管理一个对象的生命周期。

在c++中,智能指针一共定义了4种:auto_ptr、unique_ptr、shared_ptr 和 weak_ptr。其中,auto_ptr 在 C++11已被摒弃,在C++17中已经移除不可用。

2.原始指针的问题

原始指针的问题大家都懂,就是如果忘记删除,或者删除的情况没有考虑清楚,容易造成悬挂指针(dangling pointer)或者说野指针(wild pointer)。

我们看个简单的例子

   objtype *p = new objtype();
  p -> func();
  delete p;

上面的代码结构是我们经常看到的。里面的问题主要有以下两点:
1.代码的最后,忘记执行delete p的操作。
2.第一点其实还好,比较容易发现也比较容易解决。比较麻烦的是,如果func()中有异常,delete p语句执行不到,这就很难办。有的同学说可以在func中进行删除操作,理论上是可以这么做,实际操作起来,会非常麻烦也非常复杂。

此时,智能指针就可以方便我们控制指针对象的生命周期。在智能指针中,一个对象什么情况下被析构或被删除,是由指针本身决定的,并不需要用户进行手动管理,是不是瞬间觉得幸福感提升了一大截,有点幸福来得太突然的意思,终于不用我自己手动删除指针了。

3.unique_ptr

unique_ptr是独享被管理对象指针所有权(owership)的智能指针。unique_ptr对象封装一个原始指针,并负责其生命周期。当该对象被销毁时,会在其析构函数中删除关联的原始指针。

创建unique_ptr:

  void f1()
  {
       unique_ptr<int> p(new int(5));
    cout<<*p<<endl;
  }

需要注意的是,unique_ptr没有复制构造函数,不支持普通的拷贝和赋值操作。因为unique_ptr独享被管理对象指针所有权,当p2, p3失去p的所有权时会释放对应资源,此时会执行两次delete p的操作。

  void f1() {
    unique_ptr<int> p(new int(5));
    cout<<*p<<endl; unique_ptr<int> p2(p);
    unique_ptr<int> p3 = p;
  }

对于p2,p3对应的行,IDE会提示报错:

  无法引用 函数 "std::__1::unique_ptr<_Tp, _Dp>::unique_ptr(const std::__1::unique_ptr<int, std::__1::default_delete<int>> &) [其中 _Tp=int, _Dp=std::__1::default_delete<int>]" (已隐式声明) -- 它是已删除的函数

unique_ptr虽然不支持普通的拷贝和赋值操作,但却可以将所有权进行转移,使用std::move方法即可。

  void f1() {
    unique_ptr<int> p(new int(5));
    unique_ptr<int> p2 = std::move(p); 
    cout<<*p2<<endl;//error,此时p指针为空: cout<<*p<<endl;
  }

unique最常见的使用场景,就是替代原始指针,为动态申请的资源提供异常安全保证。

  objtype *p = new objtype();
  p -> func();
  delete p;

如果我们修改一下

  unique_ptr<objtype> p(new objtype());
  p -> func();
  delete p;

此时我们只要unique_ptr创建成功,unique_ptr对应的析构函数都能保证被调用,从而保证申请的动态资源能被释放掉。

 

标签:std,指针,智能,new,unique,ptr,delete
来源: https://www.cnblogs.com/ghnie/p/16408476.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有