有这样的事吗?
我说的是类似C++ new
命令的东西,即内存分配,这需要显式释放内存(或冒险内存泄漏).
我问,因为我记得以前必须通过设置表单/控件/其他对象来解决一些GDI泄漏问题,Nothing
但现在不记得是什么或为什么......
在VB6中开发时,我们是否需要担心内存管理?
就VB6中的内存管理而言,有几个值得关注的领域.
第一个是循环引用,其中子类指向父类,反之亦然.如果没有显式设置对Nothing的引用,那么对于表单来说有时也是如此,尤其是作为Target对象的编辑器的对话框.再次确保一切都设置为空将解决问题.
基本原则是1)如果一个对象指向的任何东西是"活着的"那么它就不会被垃圾收集.因此,当您设置对循环引用的父对象的引用时,子项处于活动状态,因此父级不会收集垃圾,因为父级仍处于活动状态,子级不会收集垃圾.
形式相同.如果没有将编辑对象的对话框的Target属性设置为空,只要目标对象处于活动状态,它就不会触发最后一系列事件.
这样做的最常见的副作用是您的应用程序将无法正常关闭,并且您的内存占用将增加应用程序的使用时间.
至于GDI泄漏,任何时候你使用一个使用句柄,指针的外部DLL.你将自己置于与C++相同的领域中.因此,您必须确保遵循所使用的特定API或DLL的所有规则,这些规则通常涉及明确销毁您在完成后创建的API.
圆形参考问题有一个优雅的解决方案.而不是直接引用父级的子代,而是使用代理.
首先为父对象创建一个Proxy Class.
Option Explicit Public Event GetRef(ByRef RHS As MyObject) Public Function GetMyObject() As MyObject Dim Ref As MyObject RaiseEvent GetRef(Ref) Set GetMyObject = Ref End Function
然后在Parent中定义一个私有变量
Private WithEvents MyProxy As MyObjectProxy Private Sub Class_Initialize() Set MyProxy = New MyObjectProxy End Sub
然后设置一个名为Proxy的只读属性并实现GetRef事件.
Public Property Get Proxy() As MyObjectProxy Set Proxy = MyProxy End Property Private Sub MyProxy_GetRef(RHS As MyObject) Set RHS = Me End Sub
对于孩子或其他需要参考的内容,代码如下.
Private ParentProxy As MyObjectProxy Public Property Get Parent() As MyObject If ParentProxy Is Nothing Then Set Parent = Nothing Else Set Parent = ParentProxy.GetRef End If End Property Public Property Set Parent(RHS As MyObject) If RHS Is Me Then Set MyObjectProxy = Nothing ElseIf Target Is Nothing Then Set MyObjectProxy = Nothing Else Set MyObjectProxy = RHS.Proxy End If End Property
因为事件机制没有设置引用或增加任何对象的COM引用计数,所以它避免了整个循环引用问题,这是许多VB6程序员的祸根.
注意:我得到它的来源称之为代理,但感谢Anthony的评论,我发现它也符合Mediator Pattern的定义.它使用特定的VB6 Centric功能; 事件API并不完全符合中介模式的精神.
还要意识到.NET框架与VB6的Event API等效,尽管它的实现方式不同(委托等)