定义变量的时候dim as,有的却要dim as new才能用,比如dim i as integer之后,i马上就可以使用。但Public adoConn As New ADODB.Connection却要加上new才可以使用。什么时候要new,什么时候又不需要new呢?我在有的地方看到set a = nothing,请问,什么时候需要set noting?VB有没有栈的概念?我以前用C,我觉得在函数里定义的变量,函数退出时都释放掉了?是不是这样的?我觉得只有new出来的东西,才要set nothing,不然就不需要。我这么理解对不对?VB里面也没有指针,但会不会同现内存泄漏的问题?是不是new出来的东西没有set nothing就会造成内在泄漏?

解决方案 »

  1.   

    VB的对象管理使用的是引用计数。Set Obj = Nothing 后,计数就减1。VB当然使用堆栈,也当然需要分配管理内存,但是VB把这些都封装起来了而已。
      

  2.   

    1、定义对象变量可以加New,定义其它变量不能加New
    2、你理解的基本正确,其实就是要释放对象变量所占的内存空间需要set nothing
    3、VB下有指针,只是不提倡使用罢了,所以VB的帮助没有提到指针。
         VB下调用API不当可能会引起内存泄漏。     是不是new出来的东西没有set nothing就会造成内在泄漏?
        不是,只是占用的内存空间不会释放而已。
      

  3.   

    to
    chinaboyzyq好果程序退出,占用的内存会不会自动释放?如果不能的话,那不就造成了内存泄漏?如果我在程序内new的东西,退出时还要不要set nothing,如果我没有这么做,系统会不会自动释放那些东西?还有你说调用API不当会造成内存泄漏,能不能举个例子?
      

  4.   

    Set 语句      将对象引用赋给变量或属性。语法Set objectvar = {[New] objectexpression | Nothing}Set 语句的语法包含下面部分:部分 描述 
    objectvar 必需的。变量或属性的名称,遵循标准变量命名约定。 
    New 可选的。通常在声明时使用 New,以便可以隐式创建对象。如果 New 与 Set 一起使用,则将创建该类的一个新实例。如果 objectvar 包含了一个对象引用,则在赋新值时释放该引用。不能使用 New 关键字来创建任何内部数据类型的新实例,也不能创建从属对象。 
    objectexpression 必需的。由对象名,所声明的相同对象类型的其它变量,或者返回相同对象类型的函数或方法所组成的表达式。 
    Nothing 可选的。断绝 objectvar 与任何指定对象的关联。若没有其它变量指向 objectvar 原来所引用的对象,将其赋为 Nothing 会释放该对象所关联的所有系统及内存资源。 
    说明为确保合法,objectvar 必须是与所赋对象相一致的对象类型。Dim、Private、Public、ReDim以及 Static 语句都只声明了引用对象的变量。在用 Set 语句将变量赋为特定对象之前,该变量并没有引用任何实际的对象。下面的示例说明了如何使用 Dim 来声明 Form1 类型的数组。Form1 实际上还没有实例。然后使用 Set 将新创建的 Form1 的实例的引用赋给 myChildForms 变量。在 MDI 应用程序中可以使用这些代码来创建子窗体。Dim myChildForms(1 to 4) As Form1
    Set myChildForms(1) = New Form1
    Set myChildForms(2) = New Form1
    Set myChildForms(3) = New Form1
    Set myChildForms(4) = New Form1通常,当使用 Set 将一个对象引用赋给变量时,并不是为该变量创建该对象的一份副本,而是创建该对象的一个引用。可以有多个对象变量引用同一个对象。因为这些变量只是该对象的引用,而不是对象的副本,因此对该对象的任何改动都会反应到所有引用该对象的变量。不过,如果在 Set 语句中使用 New 关键字,那么实际上就会新建一个该对象的实例。
      

  5.   

    Set MyObject = Nothing多个对象变量可以引用同一个实际对象。当 Nothing 赋值给某对象变量后,此变量就不再引用任何实际对象。当多个对象变量引用同一个对象时,只有在所有对象变量都设置为 Nothing (在设置为 Nothing 的最后一个对象变量超出范围后,显式或隐式地使用 Set 命令)后,与变量所引用的对象相关联的内存和系统资源才被释放。