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第二个指针,此时则自由存储区可能会被破坏。
- 创建动态数组(c++primer)
- C++ Primer 创建动态数组
- 【足迹C++primer】40、动态数组
- c 语言创建动态数组
- C/C++创建动态数组
- C语言动态创建数组
- C++primer 4.3 动态数组 、 动态内存分配 new delete
- 【C++ Primer每日一刷之九】创建动态数组
- C语言 如何动态创建二维数组
- C/C++动态数组的创建
- C 语言创建动态数组实现
- 【C语言】动态创建二维数组
- C/C++动态数组的创建
- C语言动态数组的创建
- C语言动态创建二维数组代码
- C++:数组动态创建与释放
- 【C++】动态二维数组的创建
- C++Primer笔记--数组
- 单例模式GetInstance()
- Rsync 算法解析与应用
- oracle win64 下载地址
- 交换机与集线器的区别
- lastPathComponent的功能
- C++ Primer 创建动态数组
- 求n!的最高位
- 进销存系统设计说明书
- 网易数据挖掘笔试题
- 程序员啊~为什么你晋升很难?
- VS2008集成QT4.7.2环境搭建
- java date转化为mysql中的Datetime格式
- Android 编程下 Touch 事件的分发和消费机制
- C++类成员函数指针