memory-leaks - 没有 GDI 泄漏的 VB6 内存泄漏

标签 memory-leaks vb6 memory-management

我发现的所有关于调试 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/

相关文章:

JavaScript 新关键字和内存管理

c++ - 在 EXIT_FAILURE 发生时清理字符串,而不是 exit(0)

ios - iOS 中的 CGContextRef 内存泄漏

c - 即使没有内存泄漏,Valgrind 也会出现无效读取错误

.net - VB6 WinSock TCP 客户端和 .NET TCP 服务器

ios - UIPopoverController 和内容 ViewController - 内存管理问题

android - 比较堆转储 (HPROF) 文件

winapi - VB6 在使用事件 Windows 消息 Hook 进行调试时退出

Windows 10 上的 VB6 通用控件

ios - 如何在应用程序中存储多个图像对象而不收到内存警告