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

程序心声 2014-01-17 11:45:51
大家好,我有一个问题,就是对于我重叠的动态申请的内存空间,该何时释放并如何释放的问题。
情况用以下代码来示例:
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只能用一次,不可能两者申请的内存都能释放掉吧。
所以,该在哪释放内存呢,是释放一次还是释放两次呢?如何把两次申请的内存都释放掉?如何处理才能保证不会内存泄漏呢?
请大家帮我考虑一下,也请高手指点,谢谢。
...全文
269 点赞 收藏 19
写回复
19 条回复
llzhe 2014年03月29日
小菜鸟啊。。。。。
回复 点赞
程序心声 2014年01月24日
非常的感谢大家,虽然一时还没有进展,但是大家的踊跃发言,集思广益,我非常感动,结贴,散分!
回复 点赞
赵4老师 2014年01月23日
要么不用new和delete 要么整个程序初始化时new,整个程序退出时delete或不delete而让操作系统自动delete
回复 点赞
fuzhongqiu 2014年01月23日
首先,从你的代码结构上看只能在Func2当中释放,但是你在func2中也new了一块内存,用pValType指向该内存,但是你在调用Func1时又把pValType的值改为了在Func1中new出来的内存的地址,你只是将Func1返回的地址值赋给了pValType,导致你丢失了Func2当中new出来的内存,你也就释放不了它了。 你应该这么用:
bool Fun2()
{
        ......
        ValType* pValType = NULL;
        pValType = Fun1(nValue);  //接受做过处理的内存空间,来使用
        ValType* pValType2 = new ValType;
        ......
        //在返回之前,释放两块内存
        delete pValType;
        delete pValType2;
        return true;
}
回复 点赞
xiaohuh421 2014年01月17日
bool Fun2() { ...... ValType* pValType = new ValType[nValue]; delete [] pValType; //由于下面一句会覆盖指针, 这里就应该释放, 如果下面还要使用,则下一句重新定义一个新的变量来接收. pValType = Fun1(nValue); //接受做过处理的内存空间,来使用 ...... return true; }
回复 点赞
mujiok2003 2014年01月17日
1.new和delete要配对,这是肯定的。 2.找到delete后crash的真正原因。找到了原因, 才谈可行的解决办法。
回复 点赞
baichi4141 2014年01月17日
引用 楼主 guoduhua 的回复:
既然new了内存空间,就应该释放,否则我怕造成内存泄漏。那么我想问的是,该何时释放呢?
最迟在你覆盖这个指针之前释放。
引用 楼主 guoduhua 的回复:
因为第三方模块在调用Fun2()时还会使用到这块内存,不能这么快就释放。
其他模块调用你的函数时是否可以使用你申请的内存,由你决定,如果你不允许,就明确告诉调用者,如果调用者非要调用,那你无需为程序崩溃负责
引用 楼主 guoduhua 的回复:
即使在Fun2内释放的话,释放的是谁申请的内存,是释放Fun1()申请的内存,还是释放Fun2()申请的内存,delete只能用一次,不可能两者申请的内存都能释放掉吧。
指向Fun2()申请的内存的指针已经被覆盖了,你已经没办法在茫茫内存条中找到该块内存了。
回复 点赞
baichi4141 2014年01月17日
        ValType* pValType = new ValType[nValue];
        pValType = Fun1(nValue);  //接受做过处理的内存空间,来使用
第一行申请得到的指针被第二行的赋值覆盖,内存泄露
回复 点赞
Jim_King_2000 2014年01月17日
建议使用vector<ValType>.

vector<ValType> Fun1(int nValue)
{
    vector<ValType> vec;
    vec.push_back(...);
...
    return vec;
}
回复 点赞
derekrose 2014年01月17日
你表达语句的能力不够,这样做是不行的。 在逻辑层面叙述需求 解决办法的方法有无数种
回复 点赞
Adol1111 2014年01月17日
ValType* pValType = Fun1(nValue); //多了一个=
回复 点赞
Adol1111 2014年01月17日
抛开具体问题来说,正常处理方法是: 1、哪里申请哪里释放 2、不要试图返回一个指针,而是返回一个对象的拷贝(局部的肯定错,new出来的调用者容易忘记释放) 3、在改变指针地址前,请先释放当前指针,并重新指向NULL 4、C++请优先考虑智能指针 至于Java调用为什么崩溃,我不太清楚,你能贴一下原来的写法吗?也可能跟Java的垃圾回收有关,不过那个就复杂了。
ValType* pValType = new ValType[nValue];
pValType = Fun1(nValue); //之前申请空间已经丢失无法释放

ValType* pValType = = Fun1(nValue); //报错?
回复 点赞
Vincent_H_91 2014年01月17日
delete
回复 点赞
nanjun520 2014年01月17日
一般情况下都可以实现谁申请,谁释放的方式,如果不能这样,那你的查看一下你对这个功能或者是需求在代码设计上面是否有问题了。 也就是程序结构或者是层次上面有改进的地方
回复 点赞
mujiok2003 2014年01月17日
引用 7 楼 guoduhua 的回复:
[quote=引用 3 楼 baichi4141 的回复:]
引用 4 楼 baichi4141 的回复:
引用 5 楼 mujiok2003 的回复:
引用 6 楼 xiaohuh421 的回复:
大家好,谢谢大家的回复,我想说的是,我最初的作法,也是像大家想的那样。 bool Fun2() { ...... ValType* pValType; pValType = Fun1(nValue); //接受做过处理的内存空间,来使用 ...... return true; } 可是,不知道为什么,每次这么做,程序就崩溃,运行不了。而且,我的程序是供JNI调用的,也就是说,我用VC做成DLL,然后给Java做的前台调用,所以,我没法调试,不知道为什么会崩溃。但是,当我改成 ValType* pValType = new ValType[nValue]; pValType = Fun1(nValue); //接受做过处理的内存空间,来使用 后,程序就不崩溃了,运行正常了,功能都能正常实现。我就一直这么写,没改。所以我才会提出今天的问题,该怎么办。[/quote] 估计和java gc有关.
回复 点赞
程序心声 2014年01月17日
引用 10 楼 baichi4141 的回复:
[quote=引用 7 楼 guoduhua 的回复:] 不知道为什么,每次这么做,程序就崩溃,运行不了。
建议每次遇到这种情况时,弄清楚为什么[/quote] 我研究了啊,可不是说研究就一定能研究出来的啊,而且不能调试啊,你说怎么办。指示下命令定指标似的,谁都会说,我也会说,那就不用在这问了。
回复 点赞
baichi4141 2014年01月17日
引用 7 楼 guoduhua 的回复:
不知道为什么,每次这么做,程序就崩溃,运行不了。
建议每次遇到这种情况时,弄清楚为什么
回复 点赞
ErrorErro 2014年01月17日
好吧,没思路…… 但是有一个方案能帮楼主一下: 使用C++11中新添加的shared_ptr可以防止内存泄漏,只需要放心大胆的像普通对象一样使用了……
回复 点赞
程序心声 2014年01月17日
引用 3 楼 baichi4141 的回复:
引用 4 楼 baichi4141 的回复:
引用 5 楼 mujiok2003 的回复:
引用 6 楼 xiaohuh421 的回复:
大家好,谢谢大家的回复,我想说的是,我最初的作法,也是像大家想的那样。 bool Fun2() { ...... ValType* pValType; pValType = Fun1(nValue); //接受做过处理的内存空间,来使用 ...... return true; } 可是,不知道为什么,每次这么做,程序就崩溃,运行不了。而且,我的程序是供JNI调用的,也就是说,我用VC做成DLL,然后给Java做的前台调用,所以,我没法调试,不知道为什么会崩溃。但是,当我改成 ValType* pValType = new ValType[nValue]; pValType = Fun1(nValue); //接受做过处理的内存空间,来使用 后,程序就不崩溃了,运行正常了,功能都能正常实现。我就一直这么写,没改。所以我才会提出今天的问题,该怎么办。
回复 点赞
发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告