在以前咱们所写过的程序中,所必需的内存空间的大小都是在程序执行以前就已经肯定了。但若是咱们须要内存大小为一个变量,其数值只有在程序运行时 (runtime)才能肯定,例若有些状况下咱们须要根据用户输入来决定必需的内存空间,那么该怎么办呢?ios
答案是动态内存分配(dynamic memory),为此C++ 集成了操做符 new 和 delete。数组
1. new 和 new [] 操做符app
动态内存分配用操做符 new 。new 后面跟一个数据类型,若是要求的元素多于一个,须要加上 [],元素数量放在 [] 中。它返回一个指向内存块开始位置的指针。语法是:spa
pointer = new type
pointer = new type [number_of_elements]操作系统
第一个表达式为数据类型为 ‘type’ 的一个元素分配内存地址。第二个表达式为数据类型为 ‘type’ 的一组元素分配一块内存,其中 number_of_elements 是整数型,表示元素的个数。例如:指针
int* foo;code
foo = new int[5];对象
在这个例子里,操做系统分配了可存储5个整型int元素的内存空间,返回指向这块空间开始位置的指针并将它赋给foo。所以,如今foo 指向一块可存储5个整型元素的合法的内存空间,以下图所示。blog
这里,foo 是一个指针,foo指向的第一个元素能够经过语句 foo[0] 或 *foo 获得,二者是等价的。第二个元素能够经过语句 foo[1] 或 *(foo+1) 获得,依次类推......内存
那么刚才所做的给指针分配内存空间与定义一个普通的数组有什么不一样呢?最重要的不一样是,一个普通数组的长度必须是一个常量,这就将它的大小在程序执行以前就被决定了。而采用动态内存分配时,数组的长度能够常量或变量,其值能够在程序执行过程当中再肯定。
动态内存分配一般由操做系统控制,在多任务的环境中,它能够被多个应用(applications)共享,所以内存有可能被用光。若是这种状况发生,操做系统将不能在遇到操做符new 时分配所需的内存,一个空值指针(null pointer)将被返回。
C++ 提供两种标准机制来检查内存是否分配成功:
(1)处理异常。
这种方法,当内存分配失败时,会抛出一个 bad_alloc 类型的异常。而后程序被终止。
这个方法是默认使用 new 时具备的异常方法,也就是:
foo = new int[5];
(2)使用 nothrow 。
当内存分配失败时,它不抛出异常 或 终止程序,而是被 new 返回一个空值指针,程序照常执行。
nothrow 是一个在头文件 <new> 中被声明的特殊对象,做为 new 的参数:
foo = new (nothrow) int[5];
当分配内存时,能够检查 foo 的值,如果 空值指针 null pointer 则是分配失败:
int* foo;
foo = new (nothrow)int[5];
if (foo == nullptr){//采起的措施}
2. delete 和 delete[] 操做符
大部分状况下,动态分配的内存只在程序运行的具体的阶段内才有用,一旦它再也不被须要,就要被释放掉,以便后面的内存分配可以使用。这就用到了delete 操做符。语法:
delete pointer;
delete []pointer;
第一种表达形式用来删除给单个元素分配的内存,第二种表达形式用来删除多元素(数组)的内存分配。
用 delete 释放内存时,被释放的指针,其指向的内存要么是经过 new 分配的;要么是空指针(null pointer)(对于空指针,delete 不会作任何操做)。
#include <iostream> #include <new>//不写vs2010不会报错
using namespace std; int main{ int i ,n; int* p; cout<<"How many numbers would you like to type ? " cin>>i;
p = new (nothrow)int [i]; //根据用户输入动态分配内存
if (p == nullptr) //检查内存是否分配成功
{cout<<"Error: member could not be allocatec!"} else { for(n = 0; n < i; n++) { cout<<"Enter number :"; cin>>p[n]; } cout<<"You have entered :"
for(n = 0; n < i; n++) { cout<<p[n]<<", "; } delete []p; } return 0; }
C语言中使用 malloc, calloc, realloc 和 free 操做内存。C++ 也支持这些语法,这些语法定义在头文件 <cstdlib> 中 (C 语言是在<stdlib.h>)。但这些与 new, delete 并不兼容,不要混用。