看到一段代码使我迷惑:var
edt: TEdit;
begin
edt := TEdit.Create(edt);
...
end;
这样的组件,如果没有手动释放,将如何?
在此情况下,是否相当于TEdit.Create(nil); ?
edt: TEdit;
begin
edt := TEdit.Create(edt);
...
end;
这样的组件,如果没有手动释放,将如何?
在此情况下,是否相当于TEdit.Create(nil); ?
对,应该是这样吧。
可能只想一个无法访问的内存空间所以这样创建的话可能会出现无法预料的异常
估计50的可能会出异常的!
对于局部变量是不会进行自动初始化的,所以会出现无法预料的错误
实际试一下,是可以创建的,而且不会报错。
下面这样也行,不过会有[Warning]
var
edt: TEdit;
a: TComponent;
begin
edt := Tedit.Create(a);
edt.Parent := self;
edt.Left := 50;
edt.Top := 50;
end;
var
Atest:TMyClass;
begin
Atest:=TMyClass.Create();
Atest.....
end;这样的代码会造成内存泄漏,过程结束的时候如果没有Free ,这个对象很难在Free了.自己创建自己释放,而且创建和释放的代码最好是在一个类中,不要离的太运.
对于局部变量是不会进行自动初始化的,所以会出现无法预料的错误
procedure TForm1.Button1Click(Sender: TObject);
var
Btn: TEdit;
begin
if Btn = nil then
Btn := TEdit.Create(Btn)
else
ShowMessage(Btn.Text);
Btn.Free;
end;
如果是定义在类的私有域系统会帮你初始化为空.对于局部变量要自己初始化的.当然对于String不用,因为它是DELPHI自己管理的,只有当赋值的时候才分配内存,声明的时候只是一个空指针.
Delphi的string在赋值的时候不会分配内存,呵呵
var
Str:String;
begin
Str:='abcd';赋值的时候不分配,这内存从哪里来的呢?end;