C++ 动态内存分配
在C++中,通过“new”运算符来实现动态内存分配。new 运算符的第一种用法如下:
P = new T;
T是任意类型名,
P是类型为T * 的指针。
这样的语句,会动态分配出一片大小为sizeof(T)字节的内存空间,并且将该内存空间的起始地址赋值给P。
示例
int * pn;
pn = new int; //(1)
* pn = 5;
语句(1)即动态分配了一片4个字节大小的内存空间,而pn 会指向这片空间,通过pn,可以读写该内存空间。
new 运算符还有第二种用法,可以用来动态分配一个任意大小的数组: 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; //编译没问题。运行时导致数组越界。
如果要求分配的空间太大,操作系统找不到足 够的内存来满足,那么动态内存分配就会失败。
保险做法是在进行较大的动态内存分配时,要 判断一下分配是否成功。
判断的方法是:如果new表达式返回值是NULL,则分配失败,否则分配成功。例如:
int * pn = new int[200000];
if( pn == NULL )
printf( “内存分配失败”);
else
printf( “内存分配成功”);
程序从操作系统动态分配所得的内存空间,使用完后应 该释放,交还操作系统,以便操作系统将这片内存空间
分配给其他程序使用。
C++提供“delete” 运算符,用以释放动态分配的内存空间。
delete运算符的基本用法是: delete 指针;
该指针必须是指向动态分配的内存空间的,否则运行时很可能 会出错。例如:
int * p = new int;
* p = 5;
delete p;
delete p; //本句会导致程序异常
如果是用new动态分配了一个数组,那么,释放该数组的时候,应以如下形式使用delete 运算符: delete []
指针;
示例
int * p = new int[20];
p[0] = 1;
delete [] p;
特别注意
New和Delete配对使用:用new 运算符动态分配的内存空间,一定要用delete 运算符予以释放。
否则即便程序运行结束,这部分内存空间仍然不会 被操作系统收回,从而成为被白白浪费掉的内存垃
圾。这种现象也称为“内存泄漏”。