【发布时间】:2010-10-15 00:37:48
【问题描述】:
不包含关键字“New”的 VB6 程序会出现内存泄漏吗?
如果有,请举个例子。
【问题讨论】:
-
这个问题措辞有点糟糕。我假设您的意思是“当您不使用对象时,VB6 中是否可能存在内存泄漏。也就是说,除了众所周知的对象循环引用问题之外,还有其他原因”。鲍勃不明白你的意思。你能改写这个问题吗?
标签: vb6 memory-management memory-leaks
不包含关键字“New”的 VB6 程序会出现内存泄漏吗?
如果有,请举个例子。
【问题讨论】:
标签: vb6 memory-management memory-leaks
您可能正在调用存在内存泄漏的第三方 DLL。
【讨论】:
是的,它可以。在我了解特定 Windows API 调用中的内存泄漏之前,我编写的一个使用透明 Blits 的 VB6 程序出现了内存泄漏。因此,虽然泄漏不在程序本身,但在 VB6 在 Win32 API 中调用的函数之一。
【讨论】:
在 COM+ 下运行时,我们在模块中使用全局变量时发生了泄漏。这是很久以前的事了,具体不记得了。
【讨论】:
...不要忘记 OCX 中的内存泄漏
【讨论】:
总结到目前为止的答案:调用另一个组件可能会导致内存泄漏。该组件可能有问题,或者您可能正在滥用它。该组件可以是 OCX 或 DLL(包括对 Windows DLL 的 API 调用,这是泄漏内存和 Windows 资源的绝佳方式,更不用说许多其他令人兴奋的问题了)。
还有一个迂腐点:您可以使用CreateObject 创建对象,因此您可以通过circular references 泄漏内存而不使用New。 onedaywhen 在 cmets 中指出,您也可以在不使用 New 的情况下使用表单变量创建循环引用。但我认为问题的关键在于 VB6 内存泄漏除了循环引用之外是否还有其他原因。
Recursive 的 answer 不会导致内存泄漏 - 引用计数将在每次执行循环时整理内存 - 请参阅我对答案的评论。
【讨论】:
在内存泄漏方面对 New 的痴迷是什么?除了通过在将引用变量设置为 Nothing 后触摸引用变量来分配另一个对象之外,我看不到任何关系。
如果你这样做,你可能还是有一个逻辑错误。不使用 New 只是意味着你会炸毁,这几乎不是我“修复”任何东西的想法。
最严重的泄漏可能涉及 API 调用,例如对 OLE 或 GDI 例程的调用,这些调用需要显式清理/释放隐式分配的数据结构。
但正如我所说,将 New 与内存泄漏相关联对我来说听起来很疯狂。
【讨论】: