何时释放动态内存,如何释放——关于new的问题

程序心声 2014-01-17 11:48:12
大家好,我有一个问题,就是对于我重叠的动态申请的内存空间,该何时释放并如何释放的问题。
情况用以下代码来示例:
ValType* Fun1(int nValue)
{
......
ValType* pValType = new ValType[nValue];
//然后对申请的pValType做处理
......
return pValType;
}

bool Fun2()
{
......
ValType* pValType = new ValType[nValue];
pValType = Fun1(nValue); //接受做过处理的内存空间,来使用
......
return true;
}

//然后第三方模块来调用Fun2()

在以上示例中,我申请了两次内存,第一次申请在Fun1()函数内,把重要信息存入所申请的内存空间。第二次申请,是为了接收上一次所申请的空间,接收后来使用其存储的信息。
既然new了内存空间,就应该释放,否则我怕造成内存泄漏。那么我想问的是,该何时释放呢?
Fun1()函数内,应该不行,因为它要把申请的空间传回上一层,释放了Fun2就接收不到了。
Fun2()吗,我在Fun2实验,一delete程序就崩溃了,判断是因为第三方模块在调用Fun2()时还会使用到这块内存,不能这么快就释放。
而且,即使在Fun2内释放的话,释放的是谁申请的内存,是释放Fun1()申请的内存,还是释放Fun2()申请的内存,delete只能用一次,不可能两者申请的内存都能释放掉吧。
所以,该在哪释放内存呢,是释放一次还是释放两次呢?如何把两次申请的内存都释放掉?如何处理才能保证不会内存泄漏呢?
请大家帮我考虑一下,也请高手指点,谢谢。
...全文
254 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
程序心声 2014-01-24
  • 打赏
  • 举报
回复
非常的感谢大家,虽然一时还没有进展,但是大家的踊跃发言,集思广益,我非常感动,结贴,散分!
心是菩提树 2014-01-18
  • 打赏
  • 举报
回复
引用 6 楼 guoduhua 的回复:
[quote=引用 1 楼 CharlesSimonyi 的回复:]
引用 2 楼 worldy 的回复:
引用 3 楼 u013061236 的回复:
引用 4 楼 schlafenhamster 的回复:
引用 5 楼 lm_whales 的回复:
大家好,谢谢大家的回复,我想说的是,我最初的作法,也是像大家想的那样。 bool Fun2() { ...... ValType* pValType; pValType = Fun1(nValue); //接受做过处理的内存空间,来使用 ...... return true; } 可是,不知道为什么,每次这么做,程序就崩溃,运行不了。而且,我的程序是供JNI调用的,也就是说,我用VC做成DLL,然后给Java做的前台调用,所以,我没法调试,不知道为什么会崩溃。但是,当我改成 ValType* pValType = new ValType[nValue]; pValType = Fun1(nValue); //接受做过处理的内存空间,来使用 后,程序就不崩溃了,运行正常了,功能都能正常实现。我就一直这么写,没改。所以我才会提出今天的问题,该怎么办。[/quote] 局部变量离开作用域就无效了
白衣的逆袭 2014-01-17
  • 打赏
  • 举报
回复
要看你new的东西最终传到什么地方吧
真相重于对错 2014-01-17
  • 打赏
  • 举报
回复
改设计。。。。
ls443085074 2014-01-17
  • 打赏
  • 举报
回复
没搞明白你什么意思,fun2 new了,又把fun1 new的内存指向fun2 new的,这个时候fun2 new的已经丢失了,明白不。既然在fun2 调用 fun1时,知道fun1要用内存 的大小,知己fun2 new 了传到fun1里面用就是了。用了在fun2删除
请叫我涛哥0-0 2014-01-17
  • 打赏
  • 举报
回复
参照下面:
//在函数外申请空间,大小根据自己
ValType* pValType = new ValType[100];
bool fun1(ValType* pVal)
{
	if (pVal == NULL)
	{
		return false;
	}
	//对pVal处理
	...
}
bool fun2(ValType* pVal)
{
	if (pVal == NULL)
	{
		return false;
	}
	//对pVal处理
	...
}
//不需要使用pValType时,销毁。
delete pValType; pValType = NULL;
程序心声 2014-01-17
  • 打赏
  • 举报
回复
引用 1 楼 CharlesSimonyi 的回复:
引用 2 楼 worldy 的回复:
引用 3 楼 u013061236 的回复:
引用 4 楼 schlafenhamster 的回复:
引用 5 楼 lm_whales 的回复:
大家好,谢谢大家的回复,我想说的是,我最初的作法,也是像大家想的那样。 bool Fun2() { ...... ValType* pValType; pValType = Fun1(nValue); //接受做过处理的内存空间,来使用 ...... return true; } 可是,不知道为什么,每次这么做,程序就崩溃,运行不了。而且,我的程序是供JNI调用的,也就是说,我用VC做成DLL,然后给Java做的前台调用,所以,我没法调试,不知道为什么会崩溃。但是,当我改成 ValType* pValType = new ValType[nValue]; pValType = Fun1(nValue); //接受做过处理的内存空间,来使用 后,程序就不崩溃了,运行正常了,功能都能正常实现。我就一直这么写,没改。所以我才会提出今天的问题,该怎么办。
lm_whales 2014-01-17
  • 打赏
  • 举报
回复
第一个函数做成内存池 第二个函数做成 operator new ,并配合做一个 operator delete 二者结合 ,只要使用 new ,delete 就可以解决问题了。
schlafenhamster 2014-01-17
  • 打赏
  • 举报
回复
bool Fun2() { static ValType* pValType = 0; ...... if(pValType) delete pValType; pValType = Fun1(nValue); //接受做过处理的内存空间,来使用 ...... return true; }
心是菩提树 2014-01-17
  • 打赏
  • 举报
回复
ValType* pValType = new ValType[nValue]; pValType = Fun1(nValue); //接受做过处理的内存空间,来使用 这里直接用fun1新申请的内存首地址覆盖了你前面申请的,导致你前面申请的内存泄露 LZ可以定义一个全局指针变量,这样在程序任何地方都可以访问到你分配的内存地址 不用的时候及时释放就行
worldy 2014-01-17
  • 打赏
  • 举报
回复
bool Fun2()
这个函数本身就有问题
定义时申请的空间泄漏
encoderlee 版主 2014-01-17
  • 打赏
  • 举报
回复
第二次申请,是为了接收上一次所申请的空间,接收后来使用其存储的信息。 既然你第一次申请后没有释放,把指针从Fun1中传了出来,Fun2中接收时不必再申请空间, 直接把Fun1返回的指针保存好就行了 ValType* Fun1(int nValue) { ...... ValType* pValType = new ValType[nValue]; //然后对申请的pValType做处理 ...... return pValType; } bool Fun2() { ...... ValType* pValType = Fun1(nValue); //接受做过处理的内存空间,来使用 ...... delete [] pValType; return true; } //然后第三方模块来调用Fun2() 这样,相当于在Fun1中申请,在Fun2中用完后释放

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧