看到一段代码使我迷惑:var
  edt: TEdit;
begin
  edt := TEdit.Create(edt);
  ...
end;
这样的组件,如果没有手动释放,将如何?
在此情况下,是否相当于TEdit.Create(nil); ?

解决方案 »

  1.   

    看了一下TComponent的构造函数,edt := TEdit.Create(edt)和TEdit.Create(nil)应该是一样的,因为此时edt还没有被创建就被引用了
      

  2.   

    to YAMABACK:
    对,应该是这样吧。
      

  3.   

    和nil不一样.你在TEdit.Create的时候,edt的值不是固定的
    可能只想一个无法访问的内存空间所以这样创建的话可能会出现无法预料的异常
      

  4.   

    在create(owner)的时候,好象会通知owner做些事情的,
    估计50的可能会出异常的!
      

  5.   

    对于Eastunfail说的偶有些不同的意见:每次申明变量,系统都给它分配内存,而这个内存应该是可用的,不会出现无法预料的结果吧
      

  6.   

    Eastunfail(龍子龍孫) 说的没错,
    对于局部变量是不会进行自动初始化的,所以会出现无法预料的错误
      

  7.   

    当然我知道这不是好方法,我也是第一次看到有人这样写。
    实际试一下,是可以创建的,而且不会报错。
    下面这样也行,不过会有[Warning]
    var
      edt: TEdit;
      a: TComponent;
    begin
      edt := Tedit.Create(a);
      edt.Parent := self;
      edt.Left := 50;
      edt.Top := 50;
    end;
      

  8.   

    因为局部变量编译器只是通过修改esp指针来在栈上划分一块数据,并没有显示的为其分配内存,也不会执行初始化,edt的值就可能是别的过程使用的时候遗留下来的。所以可能指向一个存在的对象,可能指向一个不存在不可读取得内存空间
      

  9.   

    记住一个原则,自己创建的对象自己一定要释放.传什么参数很多情况下都是无所谓的,只要类型符合就行.但有些对象会调用Owner 的一些功能,所以传递的不正确会引起错误,除非你看过这个类的代码,要不还是最好按它想要的传递.
    var 
     Atest:TMyClass;
    begin
      Atest:=TMyClass.Create();
      Atest.....
    end;这样的代码会造成内存泄漏,过程结束的时候如果没有Free ,这个对象很难在Free了.自己创建自己释放,而且创建和释放的代码最好是在一个类中,不要离的太运.
      

  10.   

    Eastunfail(龍子龍孫) 说的没错,
    对于局部变量是不会进行自动初始化的,所以会出现无法预料的错误
      

  11.   

    请大家运行以下内容。
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Btn: TEdit;
    begin
      if Btn = nil then
        Btn := TEdit.Create(Btn)
      else
        ShowMessage(Btn.Text);
      Btn.Free;
    end;
      

  12.   

    这就应算是无法预料的结果吧.要将Btn初始化成Nil;
    如果是定义在类的私有域系统会帮你初始化为空.对于局部变量要自己初始化的.当然对于String不用,因为它是DELPHI自己管理的,只有当赋值的时候才分配内存,声明的时候只是一个空指针.
      

  13.   

    To 楼上
    Delphi的string在赋值的时候不会分配内存,呵呵
      

  14.   

    To 楼上
    var
     Str:String;
    begin
      Str:='abcd';赋值的时候不分配,这内存从哪里来的呢?end;
      

  15.   

    对str赋常量值要分配,赋变量值不分配只是增加引用计数前面说错了,不好意思