在我的维生素b6形式,我在创建的几个其他形式的目的和将它们储存在件的变量。

Private m_frm1 as MyForm
Private m_frm2 as MyForm

// Later...
Set m_frm1 = New MyForm
Set m_frm2 = New MyForm

我注意到我泄漏的记忆每当这个(父母)的形式是创造和摧毁。它是必要的,对我来分配这些成员变量 NothingForm_Unload()?

一般来说,当那是必需的?

解决:这个特殊的存储器泄漏是固定的,当我做了一个 Unload 在形式的问题,不是我设置的形式 Nothing.我设法消除其他一些存储器泄漏通过明确地设置某些情况下的类模块 Nothing, 为。

有帮助吗?

解决方案

马特*迪拉德-有没有设置这些没有修复你的记忆泄漏?

维生素b6没有一个正式的垃圾收集,更多的线沿线的什么@康拉德*鲁道夫说。

实际上叫卸载于您的形式对我来说似乎是最佳的方式确保的主要形式是清除和每个子窗体清除他们的行动。

我测试了这个空白的项目和两个空白的形式。

Private Sub Form_Load()
  Dim frm As Form2
  Set frm = New Form2
  frm.Show
  Set frm = Nothing
End Sub

运行之后这两种形式的离开可见。设置frm到什么好...什么都没有。

后settign frm没什么,只能处理开放,这种形式是通过参考。

Unload Forms(1)

我看到的问题是否正确?

  • Josh

其他提示

实际上,实现维生素b6 RAII 就像C++的意义,在当地宣布引用自动获得设定为 Nothing 在结束的一块。同样地, 应该 自动复员的类变量后,执行 Class_Terminate.然而,有几个报告,这是没有完成可靠。我不记得任何严格的试验,但它一直是最好的做法重置件的变量。

@马丁

维生素b6"有用/最终用"的声明,工作"类似"使用()发言C#.NET.当然,少全球的事情,你有,对你更好。

用/最终用不喜欢的使用声明,它不会"处置"在结束发言。

用/最终用工作在VB6只是喜欢它做的VB.Net它基本上是一种快捷方式对象属性/方法的呼吁。例如

与aCustomer .FirstName="约翰" .LastName="史密斯" 结束

目的在VB有参考计数。这意味着对象保持一个数有多少其它的对象变量保持一个参考。当没有提到的对象,对象是垃圾回收(最终).这个过程的一部分,COM规范。

通常,当本地化的对象超出范围(即离子),它的参考计数下降了一,换句话说变量引用的目的是摧毁。因此,在大多数情况下你不会需要明确地设定一个目等于什么都不在退出一个子.

在所有其他情况下,你必须明确地设定对象变为什么,为了减小它的参考计数(通过一个)。设置一个目的可变什么,不一定会破坏对象,必须设置的所有引用什么。这个问题可以成为特别严重的递归的数据结构。

另一个问题是,当使用的新的关键对象变量的宣言。对象是只有建立在首先使用,不在新的关键词是使用。使用新的关键词在宣言中将重新创建的对象在第一次每次使用它的参考计数为零。这样设置一个目的没有什么可以毁掉它,但对象将自动被重新创建,如果被引用了。理想的情况是你不应宣布使用的新的关键字,但通过使用新的操作者,它没有这种复活的行为。

严格来说从来没有,但它提供了垃圾收集器的一个强烈的提示清洁的事情了。

作为一个规则: 这样做的每一次你做的对象,你已经创造了.

设置一个维生素b6参考什么都没有,降低refecences计数VB有用于这一目的。如果且只有如果计数为零,则该物体将被销毁。

不认为这只是因为你设置为什么这将是"垃圾收集"似。净

维生素b6使用的参考计数器。

我们鼓励设置为"没什么"instanciated对象,使referece C/C++代码之类的东西。这是一个漫长的时间,因为我碰到了维生素b6,但是我记得设置文件和资源,没什么。

在任何一种情况下它不会伤害(如果这是什么已经有),但是,这并不意味着对象将被销毁。

维生素b6"有用/最终用"的声明,工作"类似"使用()发言C#.NET.当然,少全球的事情,你有,对你更好。

记住,无论在哪种情况下,有时,创建一个大型的目的是更昂贵的,比维持一个参考活和重新使用它。

我有一个问题,类似于这一段时间回来。我似乎认为它还将防止的应用程序从关闭的,但它也可以适用在这里。

我拉起来的古代码,它看起来是这样的:

Dim y As Long
For y = 0 To Forms.Count -1
    Unload Forms(x)
Next

它可能是更安全的卸载m_frm1.并不仅仅是集到什么。

重要的一点还没有被在这里提到的是,设置一个目的参考,没有什么会导致对象是析构运行(Class_Terminate如果该类是写在VB)如果没有其他提到的对象(参考数为零)。

在某些情况下,特别是在使用RAII模式,终止码可执行代码,可以提出一个错误。我相信是这种情况与一些ADODB课程。另一个例子是,一个类封装文件i/o本代码在Class_Terminate可能会试图冲洗和关闭文件,如果它仍然是开放的,可以提出一个错误。

所以,重要的是要意识到,设置一个目的参考,没有什么可以提出一个错误,并对其进行相应的处理(究竟如何,将取决于你用-例如你可能忽略这样的错误,插入"上的错误,恢复下"之前"。=没有什么").

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top