Release/free 与从内存中清除 Global/Public 变量 - Excel VBA
Release/free vs Purge Global/Public Variables from memory - Excel VBA
我确实很少使用 Global/Public 变量,并且只有在它在很多方面都足够有价值的情况下才使用。
据我所知,当一个变量被声明时,计算机会保留一个特定的内存 space 供以后使用。
如果我没弄错的话,一个变量只被声明为在特定过程中有一个范围,当过程结束时,该变量的生命也是如此。换句话说,分配给该变量的内存 space 得到 released/freed.
我的主要问题:
- 有什么方法可以 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 变量指向的东西。
我确实很少使用 Global/Public 变量,并且只有在它在很多方面都足够有价值的情况下才使用。
据我所知,当一个变量被声明时,计算机会保留一个特定的内存 space 供以后使用。
如果我没弄错的话,一个变量只被声明为在特定过程中有一个范围,当过程结束时,该变量的生命也是如此。换句话说,分配给该变量的内存 space 得到 released/freed.
我的主要问题:
- 有什么方法可以 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 变量指向的东西。