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.拷贝和填充未初始化内存的算法:

最新文章

  1. Atomikos的使用过程中要注意的事
  2. 三种方法查看MySQL数据库的版本
  3. [学习笔记]JS中闭包的理解
  4. Windows 10开机的秘密在哪里
  5. Delphi 收藏
  6. spilt()的用法
  7. jsp 变量和方法的声明 Java程序片 HTML注释 JSP注释
  8. 新浪微博iOS客户端架构与优化之路
  9. erlang的escript脚本
  10. iOS 搜索框控件 最简单的dome
  11. lightoj1038(期望dp)
  12. java数字字符串累加1的解决方案
  13. spring jdbc 源码
  14. Github for Windows使用图文教程_西西软件资讯
  15. Spark技术内幕: 如何解决Shuffle Write一定要落盘的问题?
  16. Django----djagorestframwork使用
  17. Vivado级联Modelsim仿真Re-launch问题
  18. iptalbes -F
  19. JVM的反射实现
  20. Sqlite 快速插入数据到本地表中

热门文章

  1. MST Unification CodeForces - 1108F
  2. 07-SV线程以及线程间的通信
  3. MySql 小表驱动大表
  4. C++11智能指针(unique_ptr、shared_ptr、weak_ptr)(转)
  5. vue 查看dist文件里的结构
  6. ORACLE10G非归档模式下异机迁库(文件迁移)
  7. npm 基础命令
  8. 【安卓开发】Webview简单使用
  9. 01:认识QT
  10. STL-priority_queue H - 看病要排队