C++ Primer 创建动态数组

来源:互联网 发布:环保部 环境监测数据 编辑:程序博客网 时间:2024/06/10 04:10

动态分配的数组不必在编译时知道其长度,可以在运行时才确定数组长度。与数组变量不同,动态分配的数组将一直存在,直到程序显示释放它。

每一个程序在执行时都占用一块可用的内存空间,用于存放动态分配的对象,此内存空间称为程序的自由存储区或堆。C语言使用一对标准库函数malloc和free分配存储空间,而C++则使用new和delete 。

1.动态数组的定义

int *pia=new int[10];

new表达式需要指定指针类型以及在方括号中给出的数组维数。创建数组后,new将返回指向数组第一个元素的指针。在自由存储区中创建的数组对象时没有名字的,只能通过其地址间接地访问堆中的对象。

2.初始化动态分配的数组

动态分配数组时,如果数组元素具有类类型,将使用该类的默认构造函数实现初始化,如果数组元素是内置类型,则无初始化。

string *psa=new string[10];   //arrray of 10 empty strings

int *pia =new int[10];           //array of 10 uninitialized ints

也可使用跟在数组长度后面的一对空圆括号,对数组元素做值初始化:

int *pia2=new int[10]();  

圆括号要求编译器对数组做值初始化,在本例中即把数组元素都设置为0

对于动态分配的数组,其元素只能初始化为元素类型的默认值,而不能像数组变量一样,用初始化列表为数组元素提供各不相同的初值。

3.const对象的动态数组

如果我们在自由存储区中创建的数组存储了内置类型的const对象,则必须为这个数组提供初始化:因为数组元素都是const对象,无法赋值。

const int *pci_bad=new const int[100]; //error

const int *pci_ok=new const int[100]();

C++允许定义类类型的const数组,但该类类型必须提供默认构造函数:

const string *pcs=new const string[100];

4.动态空间的释放

C++为指针提供delete[] 表达式释放指针所指向的数组空间:

delete[] pia;

如果遗漏了方括号对,至少会导致运行时少释放了内存空间,从而产生内存泄漏(memory leak);对于某些系统和/或元素类型,有可能会带来更严重的运行时错误。

下面三种常见的程序错误都与动态内存分配相关:

(1)删除指向动态分配内存的指针失败,因而无法将该块内存返还给自由存储区,删除动态分配内存失败称为“内存泄漏”,内存泄漏很难发现,一般需等应用程序运行了一段时间后,耗尽了所有内存空间时,内存泄漏才会显露出来。

(2)读写已删除的对象。如果删除指针所指向的对象之后,将指针置为0值,则比较容易检测出这类错误。

(3)对同一个内存空间使用两次delete表达式。当两个指针指向同一个动态创建的对象,删除就会发生错误。如果在其中一个指针上做delete运算,将该对象的内存空间返还给自由存储区,然后接着delete第二个指针,此时则自由存储区可能会被破坏。

原创粉丝点击