您的位置:程序门 -> vb -> 基础类



请教,vb内存回收时机问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


请教,vb内存回收时机问题[已结贴,结贴人:smartcatiboy]
发表于:2008-01-17 17:25:22 楼主
vb理论上不会出现内存泄漏问题,但是在处理一些大的循环时,会涉及到变量,特别是对象内存的释放。
一般的说法时,对象在没有引用后会自动销毁,但是这个销毁是在什么时间?是过程内?还是依赖编译时生成的变量引用周期表?或者程序结束?

我现在有一个数据库小程序,大概要处理数百万跳记录,核心代码大致如下


dim   orstsource,orsttarget
dim   ore,omatches,omatch

orstsource.open   "select   *   from   tablea",oconn,3,3
orsttarget.open   "select   *   from   tableb",oconn,3,3

set   oreg=new   reexp
ore.ignorecase=true:ore.global=true
ore.pattern="略"

do   while   not   orstsource.eof
    set   omatches=ore.excute(orstsource("xx"))
    for   each   omatch   in   omatches
        orsttarget.addnew
        ........proc   omatch.....产生数百跳结果存入orsttarget
        orsttarget.update
    next
    '注意,这里没有set   omatches,omatch=nothing,而是在loop后面
    orstsource.movenext
loop
set   omatches=nothing
set   omatch=nothing


问题:
1、这个omatch在重新赋值时,前面的对象内存是立即销毁了吗??
2、我在实际使用这个程序时,内存不断上升,是由于数据库的原因,还是在loop中对象没有setnothing的原因

orstsouce有5万条,平均每条会在orsttarget产生100-200条新记录,总数非常庞大,处理了半天,只到10%,内存不断攀升,数据库是access。
发表于:2008-01-17 18:18:051楼 得分:40
1、在重新赋值的时候,变量之前的对象就已经被覆盖或更改
2、消耗内存的是数据库,而不是你的程序。如果你用的是sql,那么你会看到sql的进程的cpu占用比较多,内存的占用也比较多。
还有一点,在vb内把对象set   nothing后,内存并不会立刻释放,这时候该对象之前所占用的内存虽然已经清空,但是它仍被主线程所占用。如果其他对象或者变量需要使用内存的时候,它们会被分配到这快内存中。所以你会看到vb的程序的内存只有升,没有降的情况。
发表于:2008-01-17 18:34:152楼 得分:10
支持楼上
发表于:2008-01-17 19:04:083楼 得分:0
> > 1、在重新赋值的时候,变量之前的对象就已经被覆盖或更改  
对象指针的确是被覆盖,但是对象本身呢?
在微软的解释上说是,当对象的所有引用(显性或隐性)不存在后,对象空间被销毁
vb的set   nothing和c的free不同,相当于*p=null,而不是free(p),只要有引用,vb的对象就存在

那么覆盖呢???
关键vb系统是如何判断不再存在引用呢,是function结束后,还是编译时???或者其他。


发表于:2008-01-18 12:27:394楼 得分:0
答案都不满意

不过已经找到变通的办法解决了


快速检索

最新资讯
热门点击