C++ new与delete使用的位置,以及判断内存是否泄露的简单方式

今天突然有几个疑问

假设在子函数内部new的数组(double *p = new double[5])

  1. 该数组在子函数外部能不能再用呢?怎么用呢?
  2. 子函数结束后数组所在的内存被释放了么?
  3. 如果没又被释放,那么我们如何用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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值