【问题标题】:VB6 Memory LeakVB6 内存泄漏
【发布时间】:2010-10-15 00:37:48
【问题描述】:

不包含关键字“New”的 VB6 程序会出现内存泄漏吗?

如果有,请举个例子。

【问题讨论】:

  • 这个问题措辞有点糟糕。我假设您的意思是“当您不使用对象时,VB6 中是否可能存在内存泄漏。也就是说,除了众所周知的对象循环引用问题之外,还有其他原因”。鲍勃不明白你的意思。你能改写这个问题吗?

标签: vb6 memory-management memory-leaks


【解决方案1】:

您可能正在调用存在内存泄漏的第三方 DLL。

【讨论】:

    【解决方案2】:

    是的,它可以。在我了解特定 Windows API 调用中的内存泄漏之前,我编写的一个使用透明 Blits 的 VB6 程序出现了内存泄漏。因此,虽然泄漏不在程序本身,但在 VB6 在 Win32 API 中调用的函数之一。

    【讨论】:

      【解决方案3】:

      在 COM+ 下运行时,我们在模块中使用全局变量时发生了泄漏。这是很久以前的事了,具体不记得了。

      【讨论】:

        【解决方案4】:

        ...不要忘记 OCX 中的内存泄漏

        【讨论】:

          【解决方案5】:

          总结到目前为止的答案:调用另一个组件可能会导致内存泄漏。该组件可能有问题,或者您可能正在滥用它。该组件可以是 OCX 或 DLL(包括对 Windows DLL 的 API 调用,这是泄漏内存和 Windows 资源的绝佳方式,更不用说许多其他令人兴奋的问题了)。

          还有一个迂腐点:您可以使用CreateObject 创建对象,因此您可以通过circular references 泄漏内存而不使用Newonedaywhen 在 cmets 中指出,您也可以在不使用 New 的情况下使用表单变量创建循环引用。但我认为问题的关键在于 VB6 内存泄漏除了循环引用之外是否还有其他原因。


          Recursive 的 answer 不会导致内存泄漏 - 引用计数将在每次执行循环时整理内存 - 请参阅我对答案的评论。

          【讨论】:

          • 另一个悬念:您可以使用 VB.Form 实例创建循环引用,无需使用 New 关键字即可加载。
          【解决方案6】:

          在内存泄漏方面对 New 的痴迷是什么?除了通过在将引用变量设置为 Nothing 后触摸引用变量来分配另一个对象之外,我看不到任何关系。

          如果你这样做,你可能还是有一个逻辑错误。不使用 New 只是意味着你会炸毁,这几乎不是我“修复”任何东西的想法。

          最严重的泄漏可能涉及 API 调用,例如对 OLE 或 GDI 例程的调用,这些调用需要显式清理/释放隐式分配的数据结构。

          但正如我所说,将 New 与内存泄漏相关联对我来说听起来很疯狂。

          【讨论】:

          • 我认为这个问题措辞有点糟糕。我认为这意味着“当您不使用对象时,VB6 中是否存在内存泄漏的原因,即除了众所周知的对象循环引用问题之外”。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-08
          • 2013-01-20
          • 2011-10-31
          • 2019-08-10
          • 2013-06-24
          相关资源
          最近更新 更多