问题是这样的:我在局部函数test()程序中定义了一个动态数组(因为实际上,我是在这段程序中才能知道这个数组的长度的),并且需要把它传给主程序,所以我不能在test()中delete它,但是要保证内存的有效管理。代码如下:
#include "iostream.h"
int *test()
{
int *p;
p=new int[5];
for(int i=0; i<5; i++)
p[i]=i;
return p;
}
void main()
{
int *ptr;
ptr=test();
for(int i=0; i<5; i++)
cout<<ptr[i]<<endl;
delete [] ptr;
ptr=NULL;
}
道理是:
p本身是一个位于栈区的指针,p的初始化是用new给的,它指向一块儿堆内存。而test()结束的时候销毁了p(如果没有之后的操作的话,这块儿堆内存就成了一片泄露区),但在销毁之前把这块儿堆内存的地址给了ptr,所以最后只用删除ptr就释放这块儿堆内存了。这里需要注意的是,delete是释放ptr所指向的堆内存空间,而不是指针本身,故执行delete [] ptr