例如,如果我动态申请几个动态
private obj1 as MyClass
private obj2 as MyClass
'申请空间
set obj1=new MyClass
set obj2=new MyClass
.........
.......
'释放空间
set obj1=nothing
set obj2=nothing请问有没有自己显式地释放空间?好象在现在所有的程序,都是没有人这样做的,不像C++

解决方案 »

  1.   

    当一个对象变量超出它的范围的时候,会自动的撤销对COM对象实例的引用。COM对象具有自释放的性质,当一个COM对象实例的引用计数变为0时会自动的被销毁。所以你不必显式的调用set obj1=nothing
    set obj2=nothing。不要误解 set obj2=nothing 的意思,这句代码的意思可不是销毁COM对象,而是撤销obj2对COM对象的引用。这句代码可能导致COM对象被销毁,也可能不会导致COM对象被销毁(如果还有别的变量引用它)。VB中的对象操作是完全自动化的,和C++中由程序员自己来回收内存有很大不同。
      

  2.   

    那就是在VB中只要new一下,以后什么就不管他了,这样就安全了是不是?谢谢
      

  3.   

    不是这样的,COM对象自释放的性质也有缺点,如果两个对象出现了循环引用,就会发生死锁,谁也得不到释放。当然,在大多数情况下如你所说,只要new一下,以后什么就不管他了。
    比如在一个过程中
    private sub somesub()
    dim obj as  new MYClassend sub根本不需要Set obj=nothing
      

  4.   

    那在VB的数据库里呢,就怎么很多人都有
    conn.close
    set conn=nothing
    或者有些甚至
    if not conn is nothing then
    set conn=nothing
    end if
    这些也可以不要吗?
    谢谢!
      

  5.   

    对于数据库对象来说,由于对象间的关系复杂,系统要求严格按照一定的次序释放对象,否则会出问题。如果让VB自己处理,它就未必会按照正常的次序释放对象。所以就要用Set=nothing来显式控制了。
      

  6.   

    另外,数据库对象占用资源很大,及早的Set =nothing可以及时释放资源,不用等待VB去处理了。
      

  7.   

    请问在VB中间层中如果有一个事务
    conn.begintransaction
    (1)。
    (2)去执行SQL的事务
    (3)。
    committransaction
    在SQL中也有一事务
    procedure
    问题:
    如果在SQL中的事务执行成功返回,
    如果此时在VB的中间层中第(3)处回滚事务,在SQL中的事务是不是不能回滚,如果是应该怎么办?
    谢谢
      

  8.   

    实在抱歉,我对SQL接触较少。你可以到数据库板块提问,一定会有人答的。