代码改变世界

内存泄露学习笔记

2009-01-08 17:08  yufun  阅读(651)  评论(0编辑  收藏  举报

现在在做Memory Leak的测试,需要覆盖到Native的C++ Code和Managed C# Code,下边是学习笔记和一些自己的想法…

Native的C++代码来说,内存泄露就是New的对象没有delete,资源泄露就是申请的系统资源没有释放(最常见的就是DC的句柄),在程序退出是仍然占用系统内存和资源,概念相对Managed来说要简单很多,而且很好理解。可以用 Memory Validator或者BoundChecker来做,这些工具会很明显的给出什么地方可能会有内存泄露,并给出Call Stack,我们可以看到在哪个对象New了以后没有delete。我们通过在整个solution中搜索这个变量,去看对象有没有被Return、赋值 或者delete,如果都没有的话,那说明这个地方是一个内存泄露。

对Managed的C#代码来说,内存泄露的概念就跟Native的C++概念不同。因为所有的New所分配的内存是在托管堆上分配的,所以不存在 一般意义上的内存泄露。对Managed Code来说,内存泄露就是指有些对象被过于长时间的引用,从而导致整个程序的内存占用过多,当然关闭程序以后,这些内存还是可以被GC回收的。我们 可以通过.Net Memory Validator和.NET Memory Profiler 3.1来跟踪内存的使用情况,从而分析内存泄露。

两个例子:

1. 比如一个全局的ArrayList里边New了很多的对象,这个ArrayList只在一个函数里边使用,那么在这个函数调用结束的时候,就必须给 ArrayList赋值为null。否则这个全集的ArrayList只能等到程序结束的时候才能被释放,在这个期间因为ArrayList的引用,导致 ArrayList里边的对象不能被释放回收。

2. 比如一个SolidBrush对对象,没有包括在using语句中,那个这个对象就不会自动被调用despose接口,导致内存泄露。