zoukankan      html  css  js  c++  java
  • C++ 动态内存与智能指针

    定位new

    向new传递额外的参数。

    例如:

    1 int *p1 = new int; //如果分配失败,则new抛出std::bad_alloc
    2 int *p2 = new (nothrow) int;//如果分配失败则new返回空指针,不抛出异常

    如果我们像下面这样调用process,会发生什么?

    void process(shared_ptr<int> ptr)
    {
      //使用ptr  
    }//ptr离开作用域,被销毁

    process(shared_ptr<int> (p.get()));

    p.get()返回一个内置指针,指向p所指向的对象,并利用其创建一个新的shared_ptr,因此不会与p动态共享内存,两者的计数器均为1,因此当离开作用域后ptr被销毁,而p成为一个管理悬空内存的shared_ptr

    p和sp的定义如下,对于接下来的对process的每个调用,如果合法,解释它做了什么,如果不合法,解释错误原因。 

    auto p = new int();
    auto sp = make_shared<int> ();

    (a) process(sp);

    (b) process(new int());

    (c) process(p);

    (d) process(shared_ptr (p)); 

    (a)合法,sp是一个共享指针,调用process时将sp传递给ptr,两者指向相同的对象,引用计数器为2,结束process后,ptr被销毁,引用计数器为1。

    (b)不合法,不能讲内置指针隐式转换为shared_ptr   接受指针参数的智能指针构造函数是explicit的

    (c)不合法,不能讲内置指针隐式转换为shared_ptr

    (d)合法,但不建议使用,不应该混用智能指针和普通指针  当process结束后,p指向的内存会被释放,而p成为空悬指针

    为什么shared_ptr没有release成员?

       因为release的作用是交出指针所指向对象的控制权,而即使shared_ptr不交出控制权,其他的shared_ptr依然可以控制此对象

  • 相关阅读:
    C语言静态库与动态库(Windows下测试)
    gcc编译过程
    IFC2x3标准阅读
    ES6学习笔记(二十二)ArrayBuffer
    tensorflow学习笔记(一)安装
    ES6学习笔记(二十一)编程风格
    ES6学习笔记(二十)Module 的加载实现
    ES6学习笔记(十九)Module 的语法-export和import
    ES6学习笔记(十七)Class 的基本语法
    4、配置文件Json(未解决开通云开发)
  • 原文地址:https://www.cnblogs.com/blzm742624643/p/9688240.html
Copyright © 2011-2022 走看看