C++11新特性(45)- 和动态数组相关的新特性

我们通常称使用new T[]形式分配的内存为动态数组,C++11中包含一些和动态数组相关的特性。

使用初始化列表初始化

可以像一般的数组一样,使用初始化列表对动态数组进行初始化,代码如下:
C++11新特性(45)- 和动态数组相关的新特性

毕竟不是数组

之所以叫动态数组,我猜有两个原因,一个是它的内存是动态分配的,一个就是它可以像数组一样使用:
C++11新特性(45)- 和动态数组相关的新特性

但是动态数组和数组还是有一些区别,例如编译器无法从数组名获知数组的大小信息。下面的代码就不能正确动作:
C++11新特性(45)- 和动态数组相关的新特性
 同样地,C++11中引入的范围for也被不支持。下面的代码直接会发生编译错误:
C++11新特性(45)- 和动态数组相关的新特性
一个有趣的例外

但是这件事有一个例外,动态申请的对象数组在释放内存是时,如果需要调用析构函数,编译器会在动态数组的前面保存动态数组的大小信息。例如下面的类:

C++11新特性(45)- 和动态数组相关的新特性

在动态分配内存之后,可以像下面的代码一样取得数组的大小:

C++11新特性(45)- 和动态数组相关的新特性

有一点值得注意的是,这个方法有可能依赖于编译器的实现,所以在作者不能保证在所有的编译器中都能正常动作。

补充信息

有关上述例外的说明,可以参照下面的文章:

为什么在调用delete[]时,括号中不需要指明元素的个数?

觉得本文有帮助?请分享给更多人。

阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】

C++11新特性(45)- 和动态数组相关的新特性