关于非托管资源的内存释放问题?欢迎大家进来讨论!!!!

时间:2023-01-11 23:58:02
最近写了一个大量数据的检验程序,发现程序在运行时,对内存的占用不断增加,几乎点了全部物理内存,程序结束后内存却一点都没有被释放!


后来查了一下MSDN,得知通过实现IDisposable接口,可解决部分问题,代码如下:

[C#]
public class Base : IDisposable {
  public void Dispose() {
    this.Dispose(true);
    GC.SupressFinalize(this);
  }

  protected virtual void Dispose(bool disposing) {
    if (disposing) {
      // 托管类
    }
    // 非托管资源释放
  }

  ~Base() {
    this.Dispose(false);
  }
}

public class Derive : Base {
  protected override void Dispose(bool disposing) {
    if (disposing) {
      // 托管类
    }
    // 非托管资源释放
    base.Dispose(disposing);
  }
}

1、对于上述代码,已注释的“托管类”与“非托管资源释放”实际代码中应如何实现?希望能有一简单例子。

2、有文章说:如果对非托管资源提供了包装WrapSource。那么这个WrapSource是托管资源了,那么如何对非托管资源进行WrapSourcek呢?

3、另据说采用CLR机制也能解决内存释放问题?

望各位高手指点一二。。。。

7 个解决方案

#1


感兴趣,来学习下

#3


System.Runtime.InteropServices.Marshal.ReleaseComObject

#4


如果你的代码中没有 P/Invoke 之类的话,那基本上用不上清理非托管资源(COM Interop 没做过,不太清楚),因为你并没直接使用非托管资源,而 .NET 类库使用的非托管资源她自己已经处理好了。
2楼的例子应该有所帮助,GC.SuppressFinalize()是很见效果的。

#5


链接失效 看不到了
我也想知道--
对于上述代码,已注释的“托管类”与“非托管资源释放”实际代码中应如何实现?希望能有一简单例子。

#6


http://www.enet.com.cn/eschool/video/c/14.shtml这个参考一下吧

#7


引用 6 楼 lubyam 的回复:
http://www.enet.com.cn/eschool/video/c/14.shtml这个参考一下吧

没有解决问题,不过还是谢谢了。
我觉得“非托管资源释放”大概是指调用非托管dll中的释放方法,
“托管类”不知道是不是指的是 “GC.Collect();” 或者是别的,如果不写,会不会造成托管资源无法释放?

#1


感兴趣,来学习下

#2


#3


System.Runtime.InteropServices.Marshal.ReleaseComObject

#4


如果你的代码中没有 P/Invoke 之类的话,那基本上用不上清理非托管资源(COM Interop 没做过,不太清楚),因为你并没直接使用非托管资源,而 .NET 类库使用的非托管资源她自己已经处理好了。
2楼的例子应该有所帮助,GC.SuppressFinalize()是很见效果的。

#5


链接失效 看不到了
我也想知道--
对于上述代码,已注释的“托管类”与“非托管资源释放”实际代码中应如何实现?希望能有一简单例子。

#6


http://www.enet.com.cn/eschool/video/c/14.shtml这个参考一下吧

#7


引用 6 楼 lubyam 的回复:
http://www.enet.com.cn/eschool/video/c/14.shtml这个参考一下吧

没有解决问题,不过还是谢谢了。
我觉得“非托管资源释放”大概是指调用非托管dll中的释放方法,
“托管类”不知道是不是指的是 “GC.Collect();” 或者是别的,如果不写,会不会造成托管资源无法释放?