【问题标题】:Is a VBA object destroyed when the variable is set to a new object?当变量设置为新对象时,VBA 对象是否被破坏?
【发布时间】:2017-02-01 21:23:57
【问题描述】:

我还没有找到特定于这个问题的答案,所以希望有人可以为我解决这个问题。

我了解 VBA 垃圾收集器使用引用计数来确定是否不再需要某个对象,并显式解除您使用的变量的关联(从而减少引用计数):

Set objectVariable = Nothing

这是我现在正在处理的电子表格中的内容:

Declare Function GetObject Lib "ObjectCreator.dll" () As Object
Public MyObject as Object

Sub MyMethod()
    Set MyObject = GetObject()
        ...do stuff with MyObject...

    Set MyObject = GetObject()
        ...do stuff with my new MyObject...

    Set MyObject = GetObject()
        ...do stuff with my even newer MyObject...

    Set MyObject = Nothing
End Sub

我的问题是:创建的所有三个对象都会被 GC 销毁还是只销毁最后一个?即当一个对象的引用变量设置为另一个对象而不是设置为Nothing时,它的引用计数是否会减少?

【问题讨论】:

  • 如果你真的有一个有GetObject方法的dll,你应该在声明语句中给它起别名,这样它就不会隐藏VBA的GetObject函数。
  • @Comintern:啊,也许我应该使用不同的名称...不,DLL 没有 GetObject 方法,只是一个返回对象的方法。我使用该名称只是为了使示例简单。

标签: vba excel object garbage-collection


【解决方案1】:

当您将对象引用分配给变量时,引用计数会增加 1,而当变量因其他分配而丢失引用时,对象的引用计数会减少 1。例如:

Dim a As Collection
Set a = new Collection 'The reference count of this new Collection object is 1
Set b = a              'The reference count of the Collection object is now 2
Set b = new Collection 'The reference count of the original collection has gone back down to 1 because b is no longer a reference to it, and this new Collection has a reference count of 1

Set a = Nothing        'The original collection no longer has any active references, so VBA safely GCs it.
Set b = Nothing        'The newer collection now no longer has any active references either, so VBA safely GCs it.

现在,在您的情况下,您正在谈论一个外部 DLL,它可能在内部以不同的方式管理自己的内存或运行状态。但是 VBA 处理 COM 引用计数的方式是相同的。

【讨论】:

  • 谢谢,这就是我需要知道的。我想确保我正在处理的电子表格不会创建无尽的对象,这些对象不会在没有明确破坏 = Nothing 的变量引用的情况下被反实例化。
  • FWIW,all COM 对象以这种方式处理引用计数,而用户对象是 COM 对象。 IIR 他们扩展了在 VBE7.dll 中隐藏的第二个类型库中定义的基类。 VBA 使用 COM 引用计数接口并让 COM 服务器确定对象的生命周期。
猜你喜欢
  • 2018-02-26
  • 2010-12-25
  • 1970-01-01
  • 2021-10-04
  • 2018-12-17
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多