当前位置:  开发笔记 > 后端 > 正文

VB6中的动态内存分配

如何解决《VB6中的动态内存分配》经验,为你挑选了1个好方法。

有这样的事吗?

我说的是类似C++ new命令的东西,即内存分配,这需要显式释放内存(或冒险内存泄漏).

我问,因为我记得以前必须通过设置表单/控件/其他对象来解决一些GDI泄漏问题,Nothing但现在不记得是什么或为什么......

在VB6中开发时,我们是否需要担心内存管理?



1> RS Conley..:

就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等效,尽管它的实现方式不同(委托等)

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有