本人是从c++转向delphi的(被迫的),因此,很多问题还是习惯借鉴c++角度考虑.从ModelMaker生成单件模式代码的时候,有个函数是这样的:class function TAppInfo.AccessInstance(Request: Integer): TAppInfo;
 { $J+ }
 const FInstance: TAppInfo = nil;
 { $J- }
begin
 case Request of
   0 : ;
   1 : if not Assigned(FInstance) then FInstance := CreateInstance;
   2 : FInstance := nil;
 else
   raise Exception.CreateFmt('Illegal request %d in AccessInstance', [Request]);
 end;
 Result := FInstance;
end;问题一: FInstannce常量的生存期怎么看待?
问题二: 一般对象释放都用object.Free,FInstantce := nil,这也是释放的手段? 和.Free释放对象有什么不一样?问题三: New(TMyPointer),则释放的时候是Dispose(TMyPointer)
        使用Dispose释放指针指向的内容时,必须指定指针类型吗? 比如Dispose(mylist.Items[i]), 
        是否合法?(mylist : TList).我看到dev-cpp里面就没指定指针类型.
问题四: 局部变量是否一定要初始化,否则内容未知.用delphi超不爽,找个资料,真tmd难.垃圾书漫天飞.

解决方案 »

  1.   

    俺也很肤浅,呵呵
    1 是对象的生存周期
    2 free是释放对象  nil则是清除对象占用内存  在delphi里面,创建对象后,可以让它 = nil,之后还可以进行复制等操作,但是free后就不能再使用该对象了
    4 不一定,delphi一般会有默认值
      

  2.   

    dabaicai(一直是菜鸟) ( ) 信誉:103  2006-07-14 16:13:00  得分: 0  
    2 free是释放对象  nil则是清除对象占用内存  在delphi里面,创建对象后,可以让它 = nil,之后还可以进行复制等操作,但是free后就不能再使用该对象了
    问题是赋值nil后,还需要用户清楚对象占用的内存吗?
      
     
      

  3.   

    问题一: FInstannce常量的生存期怎么看待?
    同C++一样问题二: 一般对象释放都用object.Free,FInstantce := nil,这也是释放的手段? 和.Free释放对象有什么不一样?
    FInstantce应该是COM对象,而COM对象是不能用Free的,直接nil就可以。非COM对象的free和nil同C++问题三: New(TMyPointer),则释放的时候是Dispose(TMyPointer)使用Dispose释放指针指向的内容时,必须指定指针类型吗? 比如Dispose(mylist.Items[i]),是否合法?(mylist : TList).我看到dev-cpp里面就没指定指针类型.
    不用指定类型。C++需要指定类型吗?问题四: 局部变量是否一定要初始化,否则内容未知.
    同C++
      

  4.   

    >>问题一: FInstannce常量的生存期怎么看待?
    >>同C++一样要是和c++一样,在局部就释放了。c++有静态成员,delphi有吗?而这里作为单件模式,显然是具有全局性的,但怎么解释?问题二: 一般对象释放都用object.Free,FInstantce := nil,这也是释放的手段? 和.Free释放对象有什么不一样?
    FInstantce应该是COM对象,而COM对象是不能用Free的,直接nil就可以。非COM对象的free和nil同C++这是个单件模式,全局对象不一定是com对象。问题三: New(TMyPointer),则释放的时候是Dispose(TMyPointer)使用Dispose释放指针指向的内容时,必须指定指针类型吗? 比如Dispose(mylist.Items[i]),是否合法?(mylist : TList).我看到dev-cpp里面就没指定指针类型.
    不用指定类型。C++需要指定类型吗?c++不指定类型,释放安全吗?难道都由编译器完成?
      

  5.   

    2. 简单的说,对象创建后为指向一块内存的指针,  free 是释放该指针,但是这块内存地址的内容还在,当然它可以被占用或清除,而nil则是清除该指针指向地址的内容,而指针本身还在,也就是说,对象光nil后,还是可用的,比如负值给对象的某个属性,因为指针指向的地址还在,所以没有问题,但是如果对象(指针)被free后,则不可用
    3. 一般情况下delphi的释放是会指定类型的, 比如我在一个容器里面放了N个 Tasd类型的对象,释放的时候是  Tasd(list.items[i]).free
      

  6.   

    一般情况下,delphi里面我们只要free释放对象即可,一般情况下free后的地址虽然有内容,但是系统在新建一个对象的时候(需要的话)会占用刚才那个地址,所以在delphi里面很少用nil, 至于 COM对象我不是很清除
      

  7.   

    dibaicai说的不错.还有没有更好的现身说法,不是非常满意啊.
      

  8.   

    楼主是从C++转过来的,就要先了解C++和Delphi之间的几个差异。
    在C++里,对象变量不是指针。声明了对象变量之后,实际上也就在栈区创建了对象本身。当对象变量的生存期结束之后,对象也就自动释放了,除非是动态创建的对象。
    Delphi的对象变量和Java一样,实际上只是指向对象的指针。当声明对象变量时,对象实际上并没有自动创建。还要另外用语句进行创建。因此Delphi中所有对象都是从堆内存创建的,到最后要手动进行释放,不然它会一直存在下去。
    >>>>问题一: FInstannce常量的生存期怎么看待?FInstance的生存期只在函数中,函数结束后,它就不存在了。当然了,是这个“指针”不存在了,它所指向的对象实体(如果已经创建了的话)在被手动释放前还是一直存在的。FInstance的确也没有存在的必要了,它的值已经被当作函数的返回值被传递出去了。>>>>问题二: 一般对象释放都用object.Free,FInstantce := nil,这也是释放的手段? 和.Free释放对象有什么不一样?只有Free才能释放对象。将对象变量赋为nil值不是释放手段,这只会让它不指向任何地方,如此而已。对象不受影响。>>>问题三:不需要指定类型。>>>问题四: 局部变量是否一定要初始化,否则内容未知.要初始化。Delphi好的资料少,这的确是个问题。另外楼主说的静态成员,Delphi2006开始已经有了。
      

  9.   

    >>>>问题一: FInstannce常量的生存期怎么看待?FInstance的生存期只在函数中,函数结束后,它就不存在了。当然了,是这个“指针”不存在了,它所指向的对象实体(如果已经创建了的话)在被手动释放前还是一直存在的。FInstance的确也没有存在的必要了,它的值已经被当作函数的返回值被传递出去了。>>>>问题二: 一般对象释放都用object.Free,FInstantce := nil,这也是释放的手段? 和.Free释放对象有什么不一样?
    只有Free才能释放对象。将对象变量赋为nil值不是释放手段,这只会让它不指向任何地方,如此而已。对象不受影响。问题是,这是modelmaker生成的代码,是直接赋值nil的. 还有我确实看到过有的代码比如TXMLDocument创建的时候用constructor create,释放的时候直接赋值nil>>>问题三:不需要指定类型。这个负担都由编译器承担,有点不可思议.
    另外,有没有什么权威的地方可以直接参考的.谢谢
      

  10.   

    >>>>问题是,这是modelmaker生成的代码,是直接赋值nil的. 还有我确实看到过有的代码比如TXMLDocument创建的时候用constructor create,释放的时候直接赋值nil这个方法不是个普通的方法,它是个类方法。也就是说它可以在没有实体的情况下调用,它并不是用来释放对象的。当参数是0和2的时候返回空指针,参数是1的时候返回指向新创建的对象的指针。你看到的直接赋值nil应该不是在释放对象。当对象变量将值传给别的变量之后,清空为nil的情况很常见的。可以通过赋值nil释放对象的,只有长字符串(String)、动态数组和接口。如果某对象实现了接口,它被创建之后又被赋给接口变量,通过对接口变量赋nil值就可以释放对象。
      

  11.   

    >>>这个负担都由编译器承担,有点不可思议.C++也不用指定类型啊
      

  12.   

    问题一: FInstannce常量的生存期怎么看待?
    //这个问题有没有看到编绎指令{$j+},在这个编绎指定下声明的变量,就相当于在这个函数里面声明了一个可变的常量,比如你每一次用这个方法给值,FInstannce := obj1;而里下一次又访问这个函数时,这个FInstannce就是上一次obj1的值了,生命周期是个全局的,直到程序结束..问题二: 一般对象释放都用object.Free,FInstantce := nil,这也是释放的手段? 和.Free释放对象有什么不一样?
    //看看Free的源码就知道了
    procedure TObject.Free;
    begin
      if Self <> nil then
        Destroy;
    end;问题三: New(TMyPointer),则释放的时候是Dispose(TMyPointer)
            使用Dispose释放指针指向的内容时,必须指定指针类型吗? 比如Dispose(mylist.Items[i]), 
            是否合法?(mylist : TList).我看到dev-cpp里面就没指定指针类型.
    //不需要指定类型
    问题四: 局部变量是否一定要初始化,否则内容未知.
    //不一定,但建意初始化
      

  13.   

    >>问题一: FInstannce常量的生存期怎么看待?
    >>同C++一样要是和c++一样,在局部就释放了。c++有静态成员,delphi有吗?而这里作为单件模式,显然是具有全局性的,但怎么解释?***注意看{ $J+ }。这就是Delphi的“静态变量”问题二: 一般对象释放都用object.Free,FInstantce := nil,这也是释放的手段? 和.Free释放对象有什么不一样?
    FInstantce应该是COM对象,而COM对象是不能用Free的,直接nil就可以。非COM对象的free和nil同C++这是个单件模式,全局对象不一定是com对象。***什么叫“不一定是com对象”?如果是,那么直接nil,如果不是,直接nil就不行。
      

  14.   

    问题四: 局部变量是否一定要初始化,否则内容未知.局部变量不会拥有默认值,如果是指针,则会随机分配一个地址,不会是nil。