动态内存分配
1. new运算符
1. 动态分配一个变量:
P = new T;
其中T是任意
类型名,P是类型为
T*的指针。
动态分配出一片大小为sizeof(T)字节的内存空间,并且将该内存空间的起始地址赋值给P。
比如:
int *pn;
pn = new int;
*pn = 5;
2. 分配一个数组
P = new T[N];
T: 任意
类型名
P:类型为
T*的指针
N:要分配的数组元素的个数,可以是整数,也可以是整型表达式。
动态分配出一片大小为N*sizeof(T)字节的内存空间,并且将该内存空间的
起始地址赋值给P
比如:
int *pn;
int i = 5;
n = new int[i*20];
pn[0] = 20;
pn[100] = 30; //
编译的时候没有问题,但是运行的时候回导致数组越界的错误。
3. new运算符的返回值类型:
new T;
new T[n];
这两个表达式返回值的类型都是T*
int *p =new int;
2. delete 运算符
1. 用new动态分配的内存空间,一定要用delete运算符进行释放
delete 指针;//该指针
必须指向new出来的空间
int *p = new int;
*p = 5;
delete p;
delete p; // 导致异常,一片空间不能被delete多次。(这显然是是因为操作系统的内存保护机制。)
不删除的话,可能会一直不断地消耗掉内存,最后导致操作系统自己的内存都不够用了,从而导致系统崩溃。
2. 用delete释放动态分配的数组,要加“
[]”
delete [] 指针;//该指针
必须指向new出来的数组。
int *p = new int[20];
p[0] = 1;
delete [] p; //如果没有[],编译运行一般感受不到错误,但是会产生内存的垃圾碎片。