从内存中释放/释放与清除全局/公共变量-Excel VBA

问题描述

我确实会谨慎使用全局变量/公共变量,并且前提是它在许多方面都具有足够的回报。

据我了解,声明变量后,计算机将为其保留一个特定的内存空间供以后使用。

如果我做对了,那么当该过程结束时,仅声明该变量在特定过程中具有作用域的变量,该变量的寿命也是如此。换句话说,分配给该变量的内存空间将被释放/释放。

我的主要问题:

  1. 是否有任何方法可以释放/释放声明时分配给Global(公共)变量的内存空间?

一些研究,思考和子问题:

a)我已经进行了一些谷歌搜索,看到有人建议在代码中的所需位置放置一个“ End Statement”。 这真的释放/释放分配给Globally / Publicly声明的变量的内存空间吗?抑或是仅“清除”或“重置”变量以根本不携带任何赋值或对象(换句话说,在声明变量时分配给变量的内存空间仍然分配给它)?

b)我还看到人们将全局/公开声明的变量设置为nothing或Empty。 但是这里有同样的问题。 这真的释放/释放分配给Globally / Publicly声明的变量的内存空间吗?抑或是仅“清除”或“重置”变量以根本不携带任何赋值或对象(换句话说,在声明变量时分配给变量的内存空间仍然分配给它)?

c)删除”或“杀死”全局(公共)变量是释放还是释放声明该变量时分配给该变量的内存空间?抑或是仅“清除”或“重置”变量以根本不携带任何赋值或对象(换句话说,在声明变量时分配给变量的内存空间仍然分配给变量)?

解决方法

VB6 / VBA uses deterministic approach销毁对象。每个对象存储对其自身的引用数量。当数字达到零时,对象将被销毁。

销毁对象的方法是确保没有对象变量引用该对象。

  • 如果一个对象仅由一个全局变量引用,则将该变量设置为Nothing将会清除该变量的内容(不再指向一个对象)并销毁该对象,从而释放其内存。
  • 如果对象也被其他变量引用,则将全局变量设置为Nothing将仅清除变量的内容(不再指向对象),但是该对象将保留到所有其他引用为止设置为Nothing

对象变量本身占用指针的大小(LongPtr,4或8个字节)。通过将该变量设置为Nothing,您可以用零填充这4或8个字节,但您不会阻止变量占用这4或8个字节-也不能。

类似地,对于非对象变量,将它们设置为任意值只会改变它们所占用的固定字节数的内容,而不会删除这些字节。

唯一的例外是动态大小的数组,您可以Erase并回收分配给该数组的内存(但是指针大小的数组变量将仍然保留,并且将不指向任何数组,即所有其4或8个字节将填充零)。

重申一下,在任何情况下都不能回收为变量本身分配的空间。只有在退出声明范围的情况下才会发生这种情况-如果是全局变量,则该范围是程序终止的时间。您只能回收变量指向的内容占用的空间。