秋招日记(六)unqiue_ptr的一些知识

学习记录

  • 《现代C++语言核心特性解析》
    • 第7章 lambda表达式
    • 第8章 非静态数据成员默认初始化
    • 第9章 列表初始化
    • 第10章 默认和删除函数

面试问题解答

  • unique_ptr
    • std::unqiue_ptr实现的是专属的所有权语义,一个非空的std::unqiue_ptr总是拥有其所指涉到的资源。
    • std::unqiue_ptr只支持移动操作,无法进行复制,移动一个std::unqiue_ptr会将资源的所有权从源指针移至目标指针,源指针被置空。
    • 在执行析构操作时,由非空的std::unqiue_ptr析构其资源,默认地,资源的析构是通过对std::unqiue_ptr内部的裸指针实施delete完成。
    • 在默认的情况下,unqiue_ptr与裸指针有着相同的大小。(默认情况就是指,没有指定特别的自定义析构器)
    • std::unqiue_ptr的一个常用用法是在对象继承谱系中,作为工厂函数的返回类别。
  • make_unqiue
    • 使用make_unqiue而不是new的原因

      • 可以避免代码的冗余
      //使用make函数 
      auto upw1(std::make_unqiue<SomeClass>()); //只出现了一次,SomeClass
      //不使用make
      std::unique_ptr<SomeClass> upw2(new SomeClass); //出现了两次 SomeClass
      • 可以避免内存泄漏
      //考虑一个函数调用过程
      processWidget(std::unique_ptr<Widget>(new Widget),computePriority());
      /*
          在运行期,传递给函数的实参必须在函数调用被发起之前完成评估求值。
          所以上面的函数在调用前需要完成以下三个任务:
          1、new Widget完成求值,并在堆上申请一个widget对象
          2、将new产生的裸指针对象的托管对象unqiue_ptr进行构造
          3、完成computerPriority()的运行
          但是编译对于上面三部的求值顺序是不定的,也就是说上面的步骤可能按照 1》3》2的顺序执行,
          如果此时computerPriority()出现异常,那么第一步分配的widget对象就会产生泄漏。
      */
      //而使用make系列函数就不会出现这样的问题,因为对象的分配和托管一定会同时完成。
      processWidget(std::make_unique<Widget>(),computePriority());
    • make_unqiue的限制

      • 无法使用自定义析构器
      • 对于对象的关于大括号和小括号的初始化中存在问题


#我的秋招日记#
全部评论
c++我总学不会
点赞 回复 分享
发布于 2022-07-26 11:30

相关推荐

评论
4
6
分享

创作者周榜

更多
牛客网
牛客企业服务