C++primer 第十二章笔记 初稿

来源:互联网 发布:js中undefined null 编辑:程序博客网 时间:2024/05/20 16:40

12.1 概述

  1. 局部static对象,类的static数据成员及定义在函数之外的变量,都保存在静态内存中;

    函数内的非static对象保存在栈中;

    动态分配的对象存储在堆中(运行时分配内存);

  2. shared_ptr

    • use_count()
      返回与调用指针共享所指对象的指针数量。

    • unique()
      如果use_count()为1返回true,否则返回false。

    • 赋值
      如果进行p=q操作,则p的引用次数递减,q的引用次数递增,且当p的引用次数为0时,释放所管理的原内存。

    • make_shared<类型>(初始化)
      标准库函数,安全的内存分配方法,返回指向此对象的shared_ptr

    • 使用内置指针初始化shared_ptr可能存在的问题

      int *x = new int (42);shared_ptr<int> p1(x);process(p1);             //内存不会被释放,不存在问题process(shared_ptr<int>x)//存在问题,x被释放(不会报错)
    • get()
      返回一个指向智能指针管理对象的内置指针。

    • 初始化的第二个参数,可以接收一个函数作为删除器(不一定是谓词)。

    注:

    1. shared_ptr在重排操作中,可能会产生无用的shared_ptr,应及时删除。
    2. 内置指针与智能指针不存在隐式转换,必须直接初始化。
    3. 当使用get()方法时,很容易产生释放对象空间的疏漏。
  3. unique_ptr

    • 初始化时需要直接拷贝,该类指针不支持拷贝

      unique_ptr<int> p(new int (42));
    • release()
      返回所拥有的指针,并将unique_ptr置空。

    • reset()
      释放所指的对象。

    • reset(内置指针)
      改变指针,指向该对象。

    • 可以定义与shared_ptr类似的带删除器版本,但必须同时提供删除器类型。

    注:使用release()时,必须保存返回结果,否则容易造成内存泄漏。

  4. weak_ptr

    • use_count()
      返回与该指针指向同一个对象的shared_ptr的数量

    • expired()
      如果use_count()为0返回true,否则返回false

    • lock()
      expired()为true返回空shared_ptr,否则返回一个指向该对象的shared_ptr

    注:weak_ptr时常用来检查shared_ptr指向对象是否存在,在获取shared_ptr时应使用lock()方法。

  5. auto参与动态分配初始化时,提供初始值的括号内必须仅有单个初始化器。

  6. 动态分配内存上限虽然很大,但是也有分配上限。达到分配上限时,抛出bad_alloc异常。使用定位new可以避免该异常:

        int *p = new (nothrow) int;

12.2 动态数组

  1. 通过new操作获取的对象,并非为数组类型,而是数组元素类型的指针。因此,不能对该指针调用全局begin()和end(),也不能使用范围for。

  2. 当使用new操作分配一个长度为0的动态数组时,可以将其作为尾后迭代器使用。

  3. 当使用new运算生成动态数组,并用作shared_ptr的初始化时,必须提供删除器(因为默认是删除单个对象)。

  4. allocator类

    • 初始化

      allocator<int> a;
    • allocate(n)
      分配长度为n的,未构造的内存

    • deallocate(p,n)
      释放从p开始长度为n的内存,且有如下要求:

      • n必须是创建时所要求的大小
      • 在释放之前必须先执行destroy
    • construct(p,args)
      构造对象

    • destroy(p)
      执行析构函数

    • 为了让allocator与标准库中的其他容器一起工作,标准库还提供了两个伴随算法:

      • uninitialized_copy()
      • uninitialized_copy_n()
      • unintialized_fill()
      • uninitialized_fill_n()
0 0
原创粉丝点击