zoukankan      html  css  js  c++  java
  • 智能指针和异常、 weak_ptr、unique_ptr

    12.1.4智能指针和异常

    1.在块中创建的动态内存,如果是由内置指针来指向这块内存,那么若是在块结束时未delete这个指针,则该内存不会被释放,若在delete之前发生异常,由于还没执行delete操作,内存也不会被释放;但若是由智能指针来指向这块内存,那无论是否发生异常,都能在正确时间释放内存,正常是在块结束处,异常则是在异常处。

    2.使用智能指针应遵守的规范:

    (1)不使用相同的内置指针初始化(或reset)多个智能指针。

    (2)不delete get()返回的指针。

    (3)不使用get()初始化或reset另一个智能指针。

    (4)如果你使用get()返回的指针,记住当最后一个对应的智能指针销毁后,你的指针就变为无效了。

    (5)如果智能指针管理的资源不是new分配的内存,应传递给它一个删除器。

    12.1.5 unique_ptr

    1.Unique_ptr的定义有两种初始化方式:

    Unique_ptr<T> p(new T ())和unique_ptr<T> p(q),q是一个指向动态分配的对象的指针,

    2.unique_ptr指针不能简单拷贝和赋值,只能通过release成员和reset成员来转移对象的所有权。p.release()返回一个指向原对象的unique_ptr指针,并将p 指针置空,p.reset(q)作用和shared_ptr的reset成员一样,若参数列表为空则释放p指向的对象,否则释放p指向的对象后,令p指向q所指对象。两个函数通常的搭配为p2.reset(p3.release()).

    3.unique_ptr虽然一般不能拷贝和赋值,但有例外,我们可以拷贝或赋值一个将要被销毁的unique_ptr,常见的例子是从函数中返回一个unique_ptr或一个局部对象的拷贝。

    4.u = nullptr释放u指向的对象,将u置为空。

    5.重载删除器,unique_ptr<T, D> u(d);用类型为D的对象d代替delete释放u所指对象并将u置空。

     

    12.1.6 weak_ptr

    1.weak_ptr必须绑定到一个shared_ptr,但是它不会使shared_ptr的引用计数增加,一旦最后一个指向对象的shared_ptr被其析构函数或其他自定义的可调用函数delete掉,那么该内存对象就会被释放,因为这个性质,所以它不能控制对象的生存周期,不能改变对象的任何属性,只起一个指向的作用。

    2.不能解引用一个weak_ptr指针,也不能用cout输出一个weak_ptr的内容,也就是对象的地址。(原因有待探索)

    3.常用成员函:w.expired(),其绑定的共享指针数量为0,则返回真,否则返回假;w.lock(),绑定的共享指针数量为0,则返回一个空的共享指针,否则返回一个指向对象的共享指针。

    4.创建一个weak_ptr时,要用一个shared_ptr来初始化它:weak_ptr<int> wp(p);

    weak_ptr<int> wp(make_shared<int>(12));虽然合法,但是因为weak_ptr是弱共享,无法对对象进行任何操作,所以这样定义是没有意义的,此情况下不能用一个weak_ptr来初始化一个shared_ptr,但若是weak_ptr原来就绑定了其他共享指针,则可以初始化一个shared_ptr.

     

  • 相关阅读:
    杨辉三角实现
    三种方式都能生成同样的列表
    Python 直接赋值、浅拷贝和深度拷贝解析
    Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)
    教你玩转CSS 分组选择器和嵌套选择器
    教你玩转CSS padding(填充)
    教你玩转CSS 轮廓(outline)属性
    教你玩转CSS margin(外边距)
    教你玩转CSS border(边框)
    教你玩转CSS表格(table)
  • 原文地址:https://www.cnblogs.com/hi3254014978/p/12373461.html
Copyright © 2011-2022 走看看