Release/free 与从内存中清除 Global/Public 变量 - Excel VBA

Release/free vs Purge Global/Public Variables from memory - Excel VBA

我确实很少使用 Global/Public 变量,并且只有在它在很多方面都足够有价值的情况下才使用。

据我所知,当一个变量被声明时,计算机会保留一个特定的内存 space 供以后使用。

如果我没弄错的话,一个变量只被声明为在特定过程中有一个范围,当过程结束时,该变量的生命也是如此。换句话说,分配给该变量的内存 space 得到 released/freed.

我的主要问题:

  1. 有什么方法可以 release/free 声明时分配给全局 (Public) 变量的内存 space?

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

a) 我进行了一些谷歌搜索,看到有人建议在代码中的所需位置放置一个“结束语句”。 这真的是 release/free 分配给 Globally/Publicly 声明变量的内存 space 吗?或者这只是“清除”或“重置”变量以根本不携带分配的值或对象(换句话说,在声明变量时分配给变量的内存 space 仍然分配给它) ?

b) 我还看到有人将 Globally/Publicly 声明的变量设置为 Nothing 或 Empty。 但同样的问题在这里。 这真的是 release/free 分配给 Globally/Publicly 声明变量的内存 space 吗?或者这只是“清除”或“重置”变量以根本不携带分配的值或对象(换句话说,在声明变量时分配给变量的内存 space 仍然分配给它) ?

c) 是否“删除”或“杀死”全局(Public)变量释放或释放声明时分配给变量的内存space ?或者这只是“清除”或“重置”变量以根本不携带分配的值或对象(换句话说,在声明变量时分配给变量的内存 space 仍然分配给它) ?

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

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

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

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

类似地,对于 non-object 变量,将它们设置为任何值只会改变它们占用的固定字节数的内容,但绝不会删除这些字节。

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

重申一下,在任何情况下您都不能回收为变量本身分配的 space。只有当您退出声明它们的范围时才会发生这种情况——对于全局变量,这就是程序终止的时候。您只能回收 space 变量指向的东西。