new 和 delete 运算符。new 运算符进行分配。new 后面跟着一个数据类型说明符,如果需要一个包含多个元素的序列,还需要在方括号 [] 中指定元素的数量。它返回一个指向新分配内存块起始位置的指针。其语法是:pointer = new type
pointer = new type [number_of_elements]
type 类型的单个元素。第二个表达式用于分配一个 type 类型的元素块(一个数组),其中 number_of_elements 是一个整数值,表示元素的数量。例如: |
|
int 类型元素的空间,并返回一个指向该序列第一个元素的指针,该指针被赋给 foo(一个指针)。因此,foo 现在指向一个有效的内存块,该内存块有足够的空间容纳五个 int 类型的元素。
foo 是一个指针,因此,foo 指向的第一个元素可以通过表达式 foo[0] 或表达式 *foo(两者等价)来访问。第二个元素可以通过 foo[1] 或 *(foo+1) 来访问,依此类推……new 为内存块动态分配内存之间存在着实质性的区别。最重要的区别是,常规数组的大小必须是一个常量表达式,因此其大小必须在程序设计时、运行之前就确定。而由 new 执行的动态内存分配允许在运行时使用任何变量值作为大小来分配内存。new 运算符分配内存的请求都会被系统批准。bad_alloc 的异常。异常是 C++ 的一个强大功能,将在后面的教程中进行解释。但现在,您应该知道,如果这个异常被抛出并且没有被特定的处理程序捕获,程序执行将终止。new 默认使用的方法,并且在像下面这样的声明中使用: |
|
nothrow,当使用它时,如果内存分配失败,它不会抛出 bad_alloc 异常或终止程序,而是使 new 返回的指针成为一个空指针,程序会继续正常执行。nothrow 的特殊对象来指定,该对象在头文件 <new> 中声明,作为 new 的参数: |
|
foo 是否为空指针来检测到失败: |
|
nothrow 方法可能会产生效率较低的代码,因为它意味着在每次分配后都要显式检查返回的指针值。因此,通常首选异常机制,至少对于关键的内存分配是这样。尽管如此,由于其简单性,接下来的大多数例子将使用 nothrow 机制。delete 运算符的目的,其语法是: |
|
new 分配的单个元素的内存,第二条语句释放使用 new 和方括号 ([]) 中的大小为元素数组分配的内存。delete 的参数值应该是一个指向先前用 new 分配的内存块的指针,或者是一个空指针(在是空指针的情况下,delete 不产生任何效果)。 |
|
How many numbers would you like to type? 5 Enter number : 75 Enter number : 436 Enter number : 1067 Enter number : 8 Enter number : 32 You have entered: 75, 436, 1067, 8, 32, |
i),而不是一个常量表达式: |
|
i 输入一个非常大的值,以至于系统无法为其分配足够的内存。例如,当我试图为“How many numbers”问题输入 10 亿这个值时,我的系统无法为程序分配那么多内存,然后我收到了我们为此情况准备的文本消息 (Error: memory could not be allocated)。nothrow)还是通过捕获相应的异常。new 和 delete 运算符来分配动态内存。但在 C 语言中并没有这些运算符;取而代之的是,它使用了一个库解决方案,即在头文件 <cstdlib>(在 C 中称为 <stdlib.h>)中定义的函数 malloc、calloc、realloc 和 free。这些函数在 C++ 中也可用,并且同样可以用于分配和释放动态内存。new 返回的内存块兼容,因此不应将它们混合使用;每种分配都应该用其自己的一套函数或运算符来处理。指针 | 目录 | 数据结构 |