• 动态数组、allocator 类


    12.2 动态数组

    12.2.1 new 和数组

    1.分配一个动态数组即是在分配一个new对象时在类型名之后加一对方括号,用来存放数组大小,该数可以是任意表达式、也可以是0,只需是整形、无需是常量。数组分配成功后返回一个指向第一个对象的指针。

    2.该分配的动态数组并非是数组类型,也就不能调用数组的begin和end函数,更不能使用需要begin函数的范围for语句。

    3.我们可以在方括号后面跟一对空括号,来对数组进行值初始化,空括号内不能给出初始化器,从而也就不能用auto来分配数组了(因为auto需要通过初始化器来推断数组类型),但是我们可以用一个初始值列表来代替空括号,列表里的初识值用来初始化数组,但是初始值的数量不能大于数组大小。

    4.释放动态数组用delete[ ]p,[ ]必不可少。

    5.除了可以通过下标运算符访问数组还可以通过此for循环来访问数组:for(int * q = p; q != p + n; ++q)

    6.用智能指针unique_ptr管理动态数组:定义时需指明数组大小且需在对象类型后面跟一对空方括号,以示分配的内存为数组,例如:unique_ptr<int[]>up(new int[10];该智能指针接受下标运算符来访问数组元素。 for (size_t i = 0; i != 10; ++i)   up[i] = i;

    释放该数组则调用release()成员函数,该函数会自动使用delete[]来释放内存。

    7.如果要用shared_ptr来管理动态内存,则需提供自己的删除器:例如:

    shared_ptr<int>sp(new int[10], [](int *p) { delete[] p; });释放该数组用reset()函数。

    该智能指针不支持下标操作,访问则需用get()函数返回一个内置指针for (size_t i = 0; i != 10; ++i)      *(sp.get() + i) = i;

     

    12.2.2 allocator 类

    1.allocator允许用户先分配内存,再构造对象,分配内存用a.allocate(n),该函数返回一个指向首个内存的指针,构造对象用a.contrucr(q++, args),args可以是所构造对象类型的任意构造函数的参数列表。

    2.使用或访问内存之前必须构造对象

    3.a.destroy(q)用来释放对象,而非释放内存,因为是释放对象,所以只有构造了对象的内存才能用此函数,,释放内存用a.deallocate(p, n),n必须和所分配的内存数量大小相等,且释放内存之前必须释放对象。

    4.拷贝和填充未初始化内存的算法:

     

     

  • 相关阅读:
    mysql 数据库检查与修复的办法
    SECPATH透明模式下VLAN透传配置实例
    腾讯QQ所有的服务器
    AutoRuns 9.13 汉化版
    IP地址在数据库中的存储解决方案
    DNS智能解析 for windows 2003
    Windows Media Player ActiveX 控件参数
    删除nvidia右键菜单
    通过js控制cookies
    正确使用|(按位或)和||(逻辑或)
  • 原文地址:https://www.cnblogs.com/hi3254014978/p/12373460.html
Copyright © 2020-2023  润新知