最近我碰到了一个让我更健康的问题;它让我忙碌,我无法在网上找到透明的解释 它与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中的指针变量。 使用此声明还是再次安全,我是否错误地看到了这一点?
一般来说并不难以应用。确定并设置为空,但收到关于该主题的准确信息会很好。所以我知道为什么我这样做的百分之百。
答案 0 :(得分:12)
好问题:)
Excel控制其对象的创建。同样,它也控制着它们的破坏。
设置oApp = Nothing
只会破坏对象引用。它不会删除应用程序。要销毁Excel对象,必须使用它的.Quit
方法。
无论何时执行Set x = Nothing
,都会删除名为x
的引用(指针)到其相关对象。这并不意味着对象本身将从内存中删除。
对象是否将从内存中删除,取决于各种因素。
.Quit
方法被定义为慷慨地删除excel已分配的所有内存对象,并自行关闭。
类似于在VB6中调用表单上的Close
。例如,vb6中的表单。
Dim f As Form
Set f = Form1
f.Show
'
'~~> Rest of the code
'
Set f = Nothing
这会破坏表格吗? :)
<强>后续强>
问题2怎么样?谢谢 - 金吉森14分钟前
它可能不完全如此处所示,编译器优化可能会使事情表现不同......但这是基本概念正在发挥作用。