C++中的动态内存分配

我们知道,同一个程序有的时候运行需要很大的内存空间来处理大量的数据,有的时候运行只需要处理很少量的数据,并不需要很大的内存空间,如果总是按照最大的内存需求来定义数组的话,就会造成内存空间的浪费。比较好的做法是,在程序运行时,需要多大的内存空间就开辟多大的内存空间,这就叫做动态内存分配。

在C++中,动态内存分配使用的是new运算符,可以分配一个变量也可以分配一个数组。

1.分配一个变量

语句格式为:

P = new T

T是任意的类型名,P是类型为T * 的指针。该语句动态分配出一片大小为sizeof(T)字节的内存空间,并将该内存空间的起始地址赋值给P。如:

int * p;

p = new int;

* p = 5;

2.分配一个数组

语句格式为:

P = new T[N];

T为任意的类型名,P是类型为T * 的指针,N是要分配的数组元素的个数,可以使整形表达式。该语句动态分配出一片大小为N * sizeof(T)字节的内存空间,并将该内存空间的起始地址赋值给P。如:

int * p;

int i = 5;

p = new int[i * 20];

p[0] = 20;

p[100] = 30;            //编译没问题,但运行时会导致数组下标越界。

注意,new运算符的返回值类型为T *,如:

int * p = new int;

这条语句中new的返回值类型为int *。



在编写程序时,用“new”动态分配的内存空间,一定要用“delete”运算符进行释放。否则,new出来的内存空间会一直被该程序占用,操作系统不能为其他程序分配该内存空间,如果该程序反复地动态分配存储空间而总不释放的话,该程序占用的内存空间就会越来越多,最终就会导致操作系统运行速度很慢甚至崩溃。

释放存储空间的语句格式为:

delete P;

P是一个指针,该指针必须指向new出来的空间。如:

int * p = new int;

* p = 5;

delete p;

delete p;     //编译异常,一片空间不可以被delete多次。

再用“delete”释放动态分配的数组时,要加“[]”,其语句格式为:

delete [] P;

P是一个指针,该指针必须指向new出来的数组。如:

int * p = new int[20];

p[0] = 1;

delete [] p;

注意,千万不要忘记[],如果忘记会导致new出来的存储空间不会被完全释放,存储空间没有被回收的话就会成为内存的垃圾碎片,在操作系统运行过程中就不会进行分配了,等于就浪费掉了,这是我们在编程时需要避免的。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。