动态内存分配
1、C++中用new运算符实现动态内存分配
第一种用法:分配一个变量
- T *P=new T; 动态分配出一片大小为sizeof(T)字节的内存空间,并且将该内存空间的起始地址赋值给P。
- T:任意类型名
- P:类型为T * 的指针
eg: int * pn; pn = new int; *pn = 5; //通过pn向刚才动态分配出的空间里写了一个5
- T *P=new T; 动态分配出一片大小为sizeof(T)字节的内存空间,并且将该内存空间的起始地址赋值给P。
第二种用法:分配一个数组
- T *P=new T[N]; 动态分配出一片大小为N*sizeof(T)字节的内存空间,并且将该内存空间的起始地址赋值给P。
- T:任意类型名
- P:类型为T * 的指针
- N:要分配的数组元素的个数,可以是整型表达式。
int * pn; int i = 5; pn = new int[i * 20]; pn[0] = 20;
- T *P=new T[N]; 动态分配出一片大小为N*sizeof(T)字节的内存空间,并且将该内存空间的起始地址赋值给P。
注意:new运算符(new T; new T[n];) 返回值的类型,都是T*。这样 int * p = new int; 两边类型才能匹配。
2、用delete运算符释放动态分配的内存
用“new”动态分配的存储必须通过“delete”运算符进行释放。否则这一部分存储空间会一直被程序占用,成为内存的垃圾碎片,操作系统就不能把这一部分存储空间交给别的应用程序使用,如果程序总是反复地动态分配存储空间却总不释放的话,那程序占用的内存空间就会越来越多,最后就会导致操作系统或者其他应用程序的内存空间不够,导致系统崩溃或特别慢。
语句1:delete 指针; //该指针必须指向new出来的存储空间。
int * p = new int;
* p = 5;
delete p;
delete p; //异常,一片空间不能被delete多次
语句2:delete [ ] 指针; //该指针必须指向new出来的数组。用delete释放动态分配的数组,要加[ ]。
int * p = new int[20];
p[0] = 1;
delete [] p;