用new运算符动态内存分配:
第一种用法,分配一个变量:
P =new T;
T是任意类型名,P是类型为T*的指针。动态分配出一片大小为sizeof(T)字节的内存空间,并且将该内存空间的起始位置赋值给P;
比如:int *pn;
pn=new int;
*pn=5;通过pn修改new出来的空间,往刚才new出来的空间写了一个5.
第二种用法,分配一个数组:
P =new T[N];
T:任意类型名
P:类型为T*的指针
N:要分配的数组元素个数,可以是整型表达式。
动态分配出一片大小为N*sizeof(T)字节的内存空间,并且将该内存的起始地址赋值给P;
动态分配数组示例:
int *pn;
int i=5;
pn=new int[i*20];///有100个元素
pn[0]=20;
pn[100]=30;//编译没问题,运行时导致数组越界。100个元素数组的最大合法小标为99;
new 运算符的返回值类型:
new T;
new T[N];
这两个表达式返回值的类型都是T*;
int *p=new int;
用“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]=1;
delete [ ]p;//没有中括号不会错误,但是会导致new出来的空间没有完全释放,会成为垃圾碎片,不会被其他应用使用