外包图像处理给的dll文档,我这边使用C#调用,参数使用的是三色Byte数组,我这边传入原图的三色数组,然后得到处理完成后的三色数组值,再合成新的图片。问题是,每当我调用dll的处理函数时,内存就增长5M多,外包那边使用的是VC++开发的,他们使用MFC开发的测试程序处理过程中内存几乎没有增长,由于图片不确定处理次数,程序使用时,很快就内存不足了!请教高手有没有解决方案,对C#内存释放有帮助也好!GDI+对象释放,GC,我都使用了,只是释放了一点点!请教精通C#高手!

解决方案 »

  1.   

    使用   Marshal.AllocHGlobal 申请空间 然后使用Marshal.FreeHGlobal 释放空间看看.
      

  2.   

    谁申请的内存谁就要负责释放, dll 既然申请了内存,自然应该提供释放内存的方法。ps: 对于 C++ 来说不存在这个问题
      

  3.   

    这个内存消耗如果你没用到一些特殊的API的话 你只是调用他提供的函数,那问题肯定是出在他那边!
      

  4.   

    估计 是你的数组没有重用 ,每次穿入都是使用New出来的数组吧 
      

  5.   

    是啊,每次都是定义新的Byte数组,但是我不知道怎么将Byte数组进行销毁啊
      

  6.   

    从你提供的信息来看,应该是内存泄漏了。
    首先你需要确定是什么内存泄漏了,查看内存泄漏的工具很多,比如容易上手的AQtime,如果没有就用windbg+性能监视器。
    如果内存增长成规则变化,问题相对简单点,你可以通过windbg找到大小为每次泄漏内存大小的对象(也许是一组对象)。如果单从观察计数器无法分析出泄漏的对象的大概内容,则可以需要通过性能计数器的日志功能来记录每隔一个时间间隔的性能变化,这里你需要添加有关内存的几个计数器,托管的和非托管的都要。日志可以记录连续的性能分析结果,你可以通过这个来缝隙“动态”情况。同时你可能需要在发生内存泄漏的时候dump内存快照来进一步分析具体泄漏的对象。具体使用方法可以参考windbg的adplus命令。通过分析dump几乎可以找到所有的内存泄漏(只是工作量的大小而已)。找到内存泄漏的对象之后,你可能需要知道为什么泄漏,为什么没有被回收,这时候你你可以通过!gcroot命令来查看这个对象的根是谁,找到了根就知道为什么不会被GC回收了。上面是分析过程,如果楼主有心可以自己操练一下。针对楼主的问你,你看看是否在线程存储区上保存数据了(这种情况通过上面的方法也可以分析出来)?.NET里面没有直接销毁对象的方法,如果不再使用显式的设置为null,这样这个引用就和对象之间断开连接了,垃圾回收再次运行的时候会把那个对象回收的(实际上不是简单的删除)。