动态内存分配
用new运算符实现动态内存分配
第一种用法,分配一个变量
/*
P = new T;
T是任意类型名,P是类型为T*的指针。
动态分配出一片大小为sizeof(T)字节的内存空间,并且将该内存空间的起始地址赋值给P。
*/
int *pn;
pn = new int; //new int的返回值类型是int *
*pn = 5;
第二种用法,分配一个数组
/*
P = new T[N];
T为任意类型名;P为类型为T*的指针;N为要分配的数组元素的个数,可以是整型表达式。
动态分配出一片大小为N*sizeof(T)字节的内存空间,并且将该内存空间的起始地址赋值给P。
*/
int *pn;
int i = 5;
pn = new int[i * 20];
pn[0] = 20;
pn[100] = 30; //编译没问题。运行时导致数组越界。最大下标为99
new 运算符的返回值类型
new T;
new T[N];
这两个表达式的返回值类型都是T*
int *p = new int;
用deleta运算符释放动态分配的内存
用"new"动态分配的内存空间,一定要用“delete”运算符进行释放
delete 指针; //该指针必须指向new出来的空间
int *p = new int;
*p = 5;
delete p;
delete p; // 导致异常,一片空间不能被delete多次
用“delete”释放动态分配的数组要加上“[]”
delete []指针; //该指针必须指向new出来的数组
int *p = new int[20];
p[0] = 0;
delete []p;