今天突然有几个疑问
假设在子函数内部new的数组(double *p = new double[5])
- 该数组在子函数外部能不能再用呢?怎么用呢?
- 子函数结束后数组所在的内存被释放了么?
- 如果没又被释放,那么我们如何用delete释放呢?(不释放会导致内存泄漏)
首先看第一个问题
很明显,指针 p 随着子函数退出后,就不存在了。
那么,如何去找到数组所在的内存呢?很简单,在new数组时,将地址保存在全局变量中。
程序如下
double * GP;
void testFunction(void)
{
double * pp = new double[5];//使用new开辟内存
GP = pp; //保存地址到全局指针中
for(int i=0;i<5;i++) //给数组赋值
{
*(pp+i) = 5;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
testFunction();
cout<<*(GP);
getchar();
return 0;
}
控制台输出 5
此时第一个和第二个问题都明确了。在子函数外也可以使用该数组,内存也没有被释放。记录地址的方法也可以用来判断内存是否被正确释放(也就是内存是否泄漏)。如果某段内存已经被释放,那么你再去读它,内存里面显示的都是1。
第三个问题,如果不去释放,则会导致内存泄漏。那么怎么去delete呢?
通常我们会想到用 delete [] p;但是p已经不存在了。。。
很简单,我们使用 delete [] 保存的内存指针;
就可以了。
我们用程序验证一下
double *GP,*GP1;
void testFunction(void)
{
double * pp = new double[5];//使用new开辟内存
GP = pp; //保存地址到全局指针中
GP1 = pp;
for(int i=0;i<5;i++) //给数组赋值
{
*(pp+i) = 5;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
testFunction();
delete [] GP;
cout<<*(GP1);
getchar();
return 0;
}
此时,我们同时用两个全局指针记录下地址,一个用来释放内存,另一个去读取内存
控制台输出-2.65698e+303,说明内存已经被成功释放。
当然我们在编程中总不能总用全局指针吧,此时只要在子函数中返回指针就行。
程序如下
double *GP;
double * testFunction(void)
{
double * pp = new double[5];//使用new开辟内存
GP = pp; //保存地址到全局指针中
for(int i=0;i<5;i++) //给数组赋值
{
*(pp+i) = 5;
}
return pp;
}
int _tmain(int argc, _TCHAR* argv[])
{
double * op = testFunction();
delete [] op;
cout<<*(GP);
getchar();
return 0;
}
此时的GP是用来验证内存是否被释放,结果显示已经被释放了。
总结
我们在程序任何位置new对象都可以,只是要记住对象指针就行,最后别忘了delete