VBA引用计数 - 对象销毁

时间:2012-07-09 12:38:40

标签: excel-vba vba excel

最近我碰到了一个让我更健康的问题;它让我忙碌,我无法在网上找到透明的解释 它与Excel对象的破坏有关(我一直使用它,而且以前从未真正质疑)。

背景导致我的问题:
使用常规对象,您可以使用关键字SET和NEW来实例化对象。 例如:

Set classInstance = New className

每当我们以这种方式实例化时,对象就会在堆内存中创建,并且引用计数器会增加1 如果我不添加更多引用,以下语句将引用计数返回到零:

Set classInstance = Nothing 

当引用计数变为0时,对象将被销毁并从内存中清除,“classInstance”指向。

我读过的内容:
当我们使用“CREATEOBJECT”函数时,它返回对COM对象的引用。

Set oApp = CreateObject("Excel.Application")

即使我们可以说:

Set oApp = nothing 

对象的引用计数将变为0,oApp将不再指向该对象。

我的问题
1)为什么这种类型的对象需要在实际从内存中删除对象之前调用方法.Quit? 添加对需要.close方法的工作簿对象(workbooks.add或workbook.open)的引用时也是如此。 为什么在将引用计数设置为零时不能自动销毁这些对象? 当我们说例如:

时就是这种情况
set oRange = nothing 

2)有必要说:

oApp.Quit
set oApp = nothing 

由于在应用.Quit时已经从内存中清除了Application对象,因此不再有对象被释放 我想出的唯一原因是,为什么oApp在Quit之后会被设置为Nothing,因为它可能指向一个未使用的内存位置(在堆上),如果重新分配这个内存,可能会导致混乱(虽然在VBA中我发现这很难想象)。 如果这个结论是正确的,我会质疑自己,并且我希望从知道答案的人那里得到确认 请告诉我,如果我看错了。

3)他们在VBA中称之为“对象的引用”(例如上面代码中的oApp),我将它们看作是C中的指针变量。 使用此声明还是再次安全,我是否错误地看到了这一点?

一般来说并不难以应用。确定并设置为空,但收到关于该主题的准确信息会很好。所以我知道为什么我这样做的百分之百。

1 个答案:

答案 0 :(得分:12)

好问题:)

Excel控制其对象的创建。同样,它也控制着它们的破坏。

设置oApp = Nothing只会破坏对象引用。它不会删除应用程序。要销毁Excel对象,必须使用它的.Quit方法。

无论何时执行Set x = Nothing,都会删除名为x的引用(指针)到其相关对象。这并不意味着对象本身将从内存中删除。 对象是否将从内存中删除,取决于各种因素。

  1. 是否有更多引用指向同一个对象。如果有,则不会删除该对象。引用计数必须为零。
  2. 该对象的析构函数的内部实现。
  3. .Quit方法被定义为慷慨地删除excel已分配的所有内存对象,并自行关闭。

    类似于在VB6中调用表单上的Close。例如,vb6中的表单。

    Dim f As Form
    Set f = Form1
    f.Show
    
    '
    '~~> Rest of the code
    '
    
    Set f = Nothing
    

    这会破坏表格吗? :)

    <强>后续

      

    问题2怎么样?谢谢 - 金吉森14分钟前

    enter image description here

    它可能不完全如此处所示,编译器优化可能会使事情表现不同......但这是基本概念正在发挥作用。