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

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

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


后来查了一下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机制也能解决内存释放问题?

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

--------------------编程问答-------------------- 感兴趣,来学习下 --------------------编程问答-------------------- 请参见这里:http://socr.uwindsor.ca/exambank/dotnet/Democode/Mod09/GARBAGE%20COLLECTION/Class1.cs --------------------编程问答-------------------- System.Runtime.InteropServices.Marshal.ReleaseComObject --------------------编程问答-------------------- 如果你的代码中没有 P/Invoke 之类的话,那基本上用不上清理非托管资源(COM Interop 没做过,不太清楚),因为你并没直接使用非托管资源,而 .NET 类库使用的非托管资源她自己已经处理好了。
2楼的例子应该有所帮助,GC.SuppressFinalize()是很见效果的。 --------------------编程问答-------------------- 链接失效 看不到了
我也想知道--
对于上述代码,已注释的“托管类”与“非托管资源释放”实际代码中应如何实现?希望能有一简单例子。 --------------------编程问答-------------------- http://www.enet.com.cn/eschool/video/c/14.shtml这个参考一下吧 --------------------编程问答--------------------
引用 6 楼 lubyam 的回复:
http://www.enet.com.cn/eschool/video/c/14.shtml这个参考一下吧

没有解决问题,不过还是谢谢了。
我觉得“非托管资源释放”大概是指调用非托管dll中的释放方法,
“托管类”不知道是不是指的是 “GC.Collect();” 或者是别的,如果不写,会不会造成托管资源无法释放?
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,