读书人

关于 set nothing 的使用

发布时间: 2012-02-12 17:16:33 作者: rapoo

求助 ——关于 set nothing 的使用
什么时候要用set nothing 收回对象占用的系统资源

当我定义一个函数时

function x()
Dim Regex As RegExp
set regex = new regexp
end function

这里的regex 当调用函数时才创建 而当函数执行完成 会收回regex变量占用的系统 但是会收回对象RegExp
占用的系统资源吗???

如果答案是肯定的话 也就是不用 set regex=nothing 系统会自动 set regex=nothing
如果答案是否定的话 也就是说 regex占用的内存被释放了 但是regex引用的对象regexp占用的内存依然为其保留 且随着引用变量的回收 导致该对象不可再次引用 这是不是就是所谓的内存泄露

我觉得 第二个答案的可能性大一些 不然 我想不到 set nothing 有什么意义 但是我依然不确定 所以请教大家

谢谢!!!

[解决办法]
要搞清楚这个问题,重要的要搞清楚VB编译器的内存区域划分:代码区、堆区、栈区、数据区
Dim Regex As RegExp
是声明一个变量,系统是不会给它分配内存的。它只存在于代码区,而代码区是存放代码的,和局部变量所在的栈区无关。当释放局部变量时只会释放栈区所占用控件,只有当进程卸载时才会释放代码区的内存。
[解决办法]
就是释放, 只不过由于你的测试方法虽然思路对了,但方法不对,也就得不到正确的结果

对象初始化的时候,他内部有个计数器,实例化时+1,实例引用时+1...
释放的时候,计数器减1, 每次set nothing都减1, 直到这个数值在释放时 -1 = 0 就执行释放内存的操作,对象就会被真正的释放了

两种方法测试, 一个是按照你那代码, 在函数完成前连续写两个 set nothing,再看看在别处那个全局变量还能用吗, 在就是用 copymemory 代替 set 全局变量 = xx, copymemory 全局变量,xx,4, copymemory直接对内存操作,会绕过自动机制
[解决办法]
vb有比较完善的垃圾回收机制...这种不用nothing, vb会自动回收的

读书人网 >VB

热点推荐