日期:2014-05-20  浏览次数:20775 次

(讨论)这样是否反而会导致内存泄露?
Private   Structure   Info
                Dim   Name   As   String
                Dim   Child()   As   String
End   Structure

Private   Sub   Button6_Click(ByVal   sender   As   System.Object,   ByVal   e   As   System.EventArgs)   Handles   Button6.Click
                Dim   H(10)   As   Info
                H(0).Name   =   "aaa "
                ReDim   H(0).Child(2)
                H(1).Name   =   "bbb "
                ReDim   H(1).Child(2)
                ......
                Erase   H
End   Sub

之所以说“反而”,是因为H数组为内部对象,.Net垃圾回收机制原本会伺机自动释放它。

但现在加了最后一句“Erase   H”手动释放H所占的内存,这之前却并没有用循环语句去Erase   H(i).Child,那么“Erase   H”这句能连它们的Child数组一块儿释放吗?

如果不能,.Net因见H被手动释放又不做自动回收,那些已分配的Child岂不就造成了内存泄露?

------解决方案--------------------
H的Child对象会被垃圾回收器释放。
CLR垃圾回收器的主要原理是,当一块内存不在有引用他的对象。
经过一段时间后就会被自动回收。
H对象已经不存在时。它所使用的内存将被自动释放。
当然前提是你在程序中没有再给他传给其它全局变量。