代码之家  ›  专栏  ›  技术社区  ›  MagicKat

addhandler/removehandler未正确处理

  •  3
  • MagicKat  · 技术社区  · 16 年前

    使用 AddHandler 方法,如果我从不使用 RemoveHandler ,在某些情况下是否会导致内存泄漏?我不太确定这件事的真相。

    与c相比,vb中是否存在其他导致内存泄漏的原因?

    2 回复  |  直到 8 年前
        1
  •  11
  •   Gishu    16 年前

    好吧,通常不会。但这种可能性是存在的。
    订阅事件时,基本上是将方法的委托(func指针,如果愿意的话)交给事件发布者,只要不使用-=运算符取消订阅,事件发布者就会保留该方法。

    因此以生成子窗体和窗体订阅窗体上的单击按钮事件为例。

    button1.Click += new EventHandler(Form_Click_Handler);
    

    现在button对象将保留窗体引用。当窗体关闭/释放/设置为空时,不再需要窗体和按钮;内存被回收。

    当你有一个全局结构或对象,它有一个更大的生命周期时,问题就发生了。假设应用程序对象维护一个打开的子窗口列表。因此,每当创建子窗体时,应用程序对象订阅窗体事件,以便可以对其进行标签。在这种情况下,即使在关闭/释放窗体时,应用程序对象仍保持其活动状态(非垃圾对象保存对窗体的引用),并且不允许回收其内存。当你不断创建和关闭窗口时,你的应用程序占用了越来越多的内存。因此,您需要显式取消订阅以从应用程序中删除表单引用。

    childForm.Event -= new EventHandler(Form_Handler)
    

    所以它建议您有一个unsubscribe块(-=)来补充您的subscribe例程(+=)…但是,对于库存场景,您可以在没有它的情况下进行管理。

        2
  •  0
  •   albertein    16 年前

    如果对象A被挂接到对象B事件,则在收集对象A之前,不会收集对象B。

    事件订阅计数为对发布服务器对象的引用。

    是的,这也发生在C上,我和语言无关。