当前位置:编程学习 > C#/ASP.NET >>

调用了一个对象的具有返回值的方法却没有赋值操作,如何解决内存泄漏的问题

class A
{
public aaaa func()
{
    aaaa n=new aaaa(123)
    return n;
}
}

public int main()
{
     A a=new A();
    while(true)
    {
     a.func();
     if(condition)
        break;
     }
}
如何解决这个问题?因为我既需要调用func();又不想将其返回值赋给某个变量,因为那样同样会造成内存泄漏,不进行赋值的调用大概持续数秒钟程序就崩溃了,其内存占用如图所示:


幸好A类具有Dispose函数,目前知道的可以通过编译和运行的办法是
public int main()
{
     A a=new A();
    while(true)
    {
     aaaa temp=a.func();
     if(condition)
        break;
     temp.Dispose();
     }
}
虽然运行无问题,也没有内存泄漏,但副作用是很耗资源,不一会儿电脑就会卡死,直到执行完毕才好

各位大侠,以上的问题该如何解决?

请注意,我是无法编辑A类的代码的,因此我无法将func()的返回值改为空,上面的代码是为了描述问题

另外想问下,有没有办法在不知道代码的情况下,能否继承A类将func的返回值改为空(其他代码不动)? --------------------编程问答--------------------

        public void tescRAM()
        {
            int count = 0;
            while (count<20000)
            {
                try
                {
                    Bitmap a = new Bitmap("d:/a.bmp");
                    count++;
                }
                catch
                {
                    MessageBox.Show(count.ToString());
                    break;
                }
                //a.Dispose();
            }
            MessageBox.Show("over");
        }

为何函数调用结束也不进行内存回收呢?一定要关闭程序才算完。。。
--------------------编程问答-------------------- 怎么可能会“内存泄露”呢。 --------------------编程问答-------------------- 感觉楼主说的都是自以为的事情,出例子,别空口说。 --------------------编程问答--------------------
引用 2 楼 caozhy 的回复:
怎么可能会“内存泄露”呢。

确实会发生泄漏的,具体表现就是调试的时候不到一会儿,大概数秒钟就崩溃了 --------------------编程问答--------------------
引用 3 楼 wddw1986 的回复:
感觉楼主说的都是自以为的事情,出例子,别空口说。


例子已经给出了,你可以试一下,我6G的内存都撑不了几秒钟。。。 --------------------编程问答-------------------- 先搞清楚是什么内存泄漏然后在说问题

你这并不是内存泄漏,至于为啥崩溃很容易解释,你在不停的往内存里写数据,有多大内存都不行

至于没有及时释放,是因为GC也并不是时时刻刻都应该出来滴,如果GC时时刻刻都占着cpu,额你还编啥程序,你编出来也运行不了,因为GC占着了

在说句体外话,你在主线程里阻塞,并不间断写数据到内存,不卡死就比较奇怪 --------------------编程问答--------------------
引用 楼主 xjw163 的回复:
class A
{
public aaaa func()
{
    aaaa n=new aaaa(123)
    return n;
}
}
如何解决这个问题?因为我既需要调用func();又不想将其返回值赋给某个变量,因为那样同样会造成内存泄漏,

解决不了,因为你明知道这是个死循环、就算是100G内存也会崩溃,而你故意在这里撒娇。 --------------------编程问答--------------------
引用 楼主 xjw163 的回复:
     A a=new A();
     while(true)
    {
     a.func();
      if(condition)
        break;
      }


调用GC之类的,其实针对某些人来说都是下下策。我觉得最关键地是问:你这个循环程序是闲着没事写出来的?还是非要这样写? --------------------编程问答--------------------
引用 8 楼 sp1234 的回复:
Quote: 引用 楼主 xjw163 的回复:

     A a=new A();
     while(true)
    {
     a.func();
      if(condition)
        break;
      }


调用GC之类的,其实针对某些人来说都是下下策。我觉得最关键地是问:你这个循环程序是闲着没事写出来的?还是非要这样写?


您看了我这个问题应该能猜到http://bbs.csdn.net/topics/390655632
因为我现在在做一个跟视频有关的程序,目的是提取视频的指定帧,我选择使用aforge.Video.FFmpeg来读取,但是读取视频的函数只有readvideoframe();
只能用这个方法来获取Bitmap videoFrame = reader.ReadVideoFrame();但是我只想要我指定的一些帧,ReadVideoFrame()方法不提供直接直接读取指定帧的功能,因此不得不一帧一帧的使用ReadVideoFrame()往下读。如果不使用Bitmap videoFrame = reader.ReadVideoFrame();再videoFrame.Dispose();,而是直接用reader.ReadVideoFrame();这样的话,如帖中所说,程序会在几秒内崩溃,所以才有了以上提问。 --------------------编程问答-------------------- 内存泄露,开什么玩笑,楼主不要乱说。 --------------------编程问答-------------------- 擦!一看吓一跳 。 --------------------编程问答-------------------- 顶上去求解答呀
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,