我发现的所有关于调试 VB6 代码中内存泄漏的建议都集中在 GDI 泄漏上。然而,在我的情况下,有证据表明我没有 GDI 泄漏,但可能确实存在内存泄漏。造成此类泄漏的可能原因是什么,和/或帮助我确定导致此泄漏的程序部分的好工具是什么?
最佳答案
不幸的是,VB6 没有足够的调试工具来检测对象泄漏。我通常在每个类、表单或用户控件中使用几个辅助函数自行实现实例簿记。基本模式是这样的
Private Const MODULE_NAME As String = "<<class_name_here>>"
#If DebugMode Then
Private m_sDebugID As String
#End If
#If DebugMode Then
Private Sub Class_Initialize()
DebugInstanceInit MODULE_NAME, m_sDebugID, Me
End Sub
#End If
#If DebugMode Then
Private Sub Class_Terminate()
DebugInstanceTerm MODULE_NAME, m_sDebugID
End Sub
#End If
辅助函数DebugInstanceInit
生成下一个顺序id并将其分配给m_sDebugID
,然后将模块名称和ObjPtr(Me)
存储在集合中,输入 ID。
辅助函数DebugInstanceTerm
使用m_sDebugID
作为键从集合中删除条目。
这样,在应用程序执行的每个时刻,您都可以转储此实例集合并识别已分配但仍未终止的对象的数量和类型。如果连续打开和关闭表单增加了对象计数,则可能由于循环引用而泄漏对象(例如集合->条目和条目->集合)。
大多数框架和其他语言都内置了这种簿记功能(至少在调试版本中),但不幸的是 VB6 对源代码元数据(MODULE_NAME、FUNC_NAME、LINE_NUMBER)和对象生命周期管理的支持很差。缺乏实现继承在这里也会造成伤害。
关于memory-leaks - 没有 GDI 泄漏的 VB6 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7406462/