21.3.3 释放堆内存
由于系统不负责堆内存块的释放,它的释放必须由程序本身来控制。如果没有正常释放堆内存将会引起内存泄露。与malloc()函数相对应的释放函数为:
- void free(void *pointer);
该函数释放pointer指针所指向的内存。与new对应的释放函数为:
- delete [] pointer;
该语句释放pointer指针指向的一块内存。如果pointer不是数组,则不需要加"[]"。此前的示例中对堆内存的使用都是不安全的,因为都缺少了释放操作,下面就对21.3.2节的示例加入释放操作,修改如下。
【示例21-10】 带有释放操作的动态数组的实现。
- int main()
- {
- int size;
- cout << "请输入数组的维数: ";
- cin>>size;
- int *p =0;
- if (size%2==0)
- p=new int[size];
- else
- p=(int*)malloc(size*sizeof(int));
- for(int i=0; i<size; i++)
- {
- p[i] = i * 10;
- }
- for(int i=0; I < size; i++)
- {
- cout << "第" << i << "个数组元素:";
- cout << *p++ ;
- cout << "\n";
- }
- if (size%2==0)
- delete [] p;
- else
- free(p);
- p=NULL;
- return 0;
- }
分析:该示例与21.3.2节的区别在于加入了最后的释放操作。如果不加该操作,由new和malloc()申请的内存就没有得到释放。因此程序运行结束后,这些内存就没有被系统收回,导致产生内存泄露,而且堆内存会越来越少。
【责任编辑:
云霞 TEL:(010)68476606】