原文:http://see.xidian.edu.cn/cpp/biancheng/view/51.html
堆内存
数组的存储空间必须在程序运行前申请,即数组的大小在编译前必须是已知的常量表达式。空间申请得太大会造成浪费,空间申请得太小会造成数据溢出而使得程序异常。所以,为了解决这个问题,我们需要能够在程序运行时根据实际情况申请内存空间。
在C++中,允许我们在程序运行时根据自己的需要申请一定的内存空间,我们把它称为堆内存(Heap)空间。
申请堆内存
new 数据类型[表达式];
其中,表达式可以是一个整型正常量,也可以是一个有确定值的整型正变量,其作用类似声明数组时的元素个数,所以两旁的中括号不可省略。如果我们只申请一个变量的空间,则该表达式可以被省略,即写作:
new 数据类型;
释放堆内存
当一个程序运行完毕之后,它所使用的数据就不再需要。由于内存是有限的,所以它原来占据的内存空间也应该释放给别的程序使用。对于普通变量和数组,在程序结束运行以后,系统会自动将它们的空间回收。然而对于我们自己分配的堆内存空间,大多数系统都不会将它们回收。如果我们不人为地对它们进行回收,只“借”不“还”,那么系统资源就会枯竭,电脑的运行速度就会越来越慢,直至整个系统崩溃。我们把这种只申请空间不释放空间的情况称为内存泄露(Memory Leak)。
确认申请的堆内存空间不再使用后,我们用delete操作符来释放堆内存空间,其语法格式为:
delete [] 指向堆内存首元素的指针;
如果申请的是一个堆内存变量,则delete后的[]可以省略;如果申请的是一个堆内存数组,则该[]不能省略,否则还是会出现内存泄露。另外,我们也不难发现,delete后的指针就是通过new获得的指针,如果该指针的数据被修改或丢失,也可能造成内存泄露。
实例
#include "iostream.h"
int main()
{
int size;
float sum=0;
int *heapArray;
cout <<"请输入元素个数:";
cin >>size;
heapArray=new int[size];
cout <<"请输入各元素:" <<endl;
for (int i=0;i<size;i++)
{
cin >>heapArray[i];
sum=sum+heapArray[i];
}
cout <<"这些数的平均值为" <<sum/size <<endl;
delete [] heapArray;
return 0;
}
可见,申请的堆内存数组在使用上和一般的数组并无差异。我们需要记住的是,申请了资源用完了就一定要释放,这是程序员的好习惯,也是一种责任。
<br />本文来自【C语言中文网】:<a href="http://see.xidian.edu.cn/cpp/biancheng/view/51.html" target="_blank">http://see.xidian.edu.cn/cpp/biancheng/view/51.html</a>可见,申请的堆内存数组在使用上和一般的数组并无差异。我们需要记住的是,申请了资源用完了就一定要释放,这是程序员的好习惯,也是一种责任。