VBA引用计数 - 对象销毁

Tra*_*ace 23 excel vba excel-vba

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

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

Set classInstance = New className
Run Code Online (Sandbox Code Playgroud)

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

Set classInstance = Nothing 
Run Code Online (Sandbox Code Playgroud)

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

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

Set oApp = CreateObject("Excel.Application")
Run Code Online (Sandbox Code Playgroud)

即使我们可以说:

Set oApp = nothing 
Run Code Online (Sandbox Code Playgroud)

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

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

set oRange = nothing 
Run Code Online (Sandbox Code Playgroud)

2)有必要说:

oApp.Quit
set oApp = nothing 
Run Code Online (Sandbox Code Playgroud)

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

3)他们在VBA中称之为"对象的引用"(例如上面代码中的oApp),我将它们视为C中的指针变量.使用此语句是否安全或再次使用,我是否错误地看到了这一点?

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

Sid*_*out 12

好问题 :)

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

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

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

  1. 是否有更多引用指向同一个对象.如果有,则不会删除该对象.引用计数必须为零.
  2. 该对象的析构函数的内部实现.

.Quit方法被定义为优雅地删除excel已分配的所有内存对象,并自行关闭.

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

Dim f As Form
Set f = Form1
f.Show

'
'~~> Rest of the code
'

Set f = Nothing
Run Code Online (Sandbox Code Playgroud)

这会破坏形式吗?:)

跟进

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

在此输入图像描述

它可能不完全如此处所示,并且编译器优化可能使事情表现不同......但这是工作中的基本概念.