组件的Owner如果是其自身?

saxash 2005-07-08 03:28:09
看到一段代码使我迷惑:

var
edt: TEdit;
begin
edt := TEdit.Create(edt);
...
end;
这样的组件,如果没有手动释放,将如何?
在此情况下,是否相当于TEdit.Create(nil); ?
...全文
219 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eastunfail 2005-07-11
  • 打赏
  • 举报
回复
对str赋常量值要分配,赋变量值不分配只是增加引用计数

前面说错了,不好意思
ZyxIp 2005-07-10
  • 打赏
  • 举报
回复
To 楼上
var
Str:String;
begin
Str:='abcd';赋值的时候不分配,这内存从哪里来的呢?

end;
Eastunfail 2005-07-09
  • 打赏
  • 举报
回复
To 楼上
Delphi的string在赋值的时候不会分配内存,呵呵
ZyxIp 2005-07-09
  • 打赏
  • 举报
回复
这就应算是无法预料的结果吧.

要将Btn初始化成Nil;
如果是定义在类的私有域系统会帮你初始化为空.对于局部变量要自己初始化的.

当然对于String不用,因为它是DELPHI自己管理的,只有当赋值的时候才分配内存,声明的时候只是一个空指针.

ZyxIp 2005-07-09
  • 打赏
  • 举报
回复
记住一个原则,自己创建的对象自己一定要释放.

传什么参数很多情况下都是无所谓的,只要类型符合就行.

但有些对象会调用Owner 的一些功能,所以传递的不正确会引起错误,除非你看过这个类的代码,要不还是最好按它想要的传递.
var
Atest:TMyClass;
begin
Atest:=TMyClass.Create();
Atest.....
end;

这样的代码会造成内存泄漏,过程结束的时候如果没有Free ,这个对象很难在Free了.

自己创建自己释放,而且创建和释放的代码最好是在一个类中,不要离的太运.
saxash 2005-07-09
  • 打赏
  • 举报
回复
那么请问什么情况下创建对象会出错,能不能模拟一下创建时出错的环境?
GoldProgramer 2005-07-09
  • 打赏
  • 举报
回复
请大家运行以下内容。


procedure TForm1.Button1Click(Sender: TObject);
var
Btn: TEdit;
begin
if Btn = nil then
Btn := TEdit.Create(Btn)
else
ShowMessage(Btn.Text);
Btn.Free;
end;
GoldProgramer 2005-07-09
  • 打赏
  • 举报
回复
Eastunfail(龍子龍孫) 说的没错,
对于局部变量是不会进行自动初始化的,所以会出现无法预料的错误
dejoy 2005-07-08
  • 打赏
  • 举报
回复
这样的代码真是没有水准,只有初初初级程序员才会写出这样不负责任的代码。这样的代码是非常不稳定的,随时有可能出现异常。这样的代码用来讨论学习还可以,大家千万不要在自己的程序中使用这样的代码。
何鲁青 2005-07-08
  • 打赏
  • 举报
回复
很对!!!学习
Eastunfail 2005-07-08
  • 打赏
  • 举报
回复
因为局部变量编译器只是通过修改esp指针来在栈上划分一块数据,并没有显示的为其分配内存,也不会执行初始化,edt的值就可能是别的过程使用的时候遗留下来的。所以可能指向一个存在的对象,可能指向一个不存在不可读取得内存空间
saxash 2005-07-08
  • 打赏
  • 举报
回复
当然我知道这不是好方法,我也是第一次看到有人这样写。
实际试一下,是可以创建的,而且不会报错。
下面这样也行,不过会有[Warning]
var
edt: TEdit;
a: TComponent;
begin
edt := Tedit.Create(a);
edt.Parent := self;
edt.Left := 50;
edt.Top := 50;
end;
zwjchina 2005-07-08
  • 打赏
  • 举报
回复
Eastunfail(龍子龍孫) 说的没错,
对于局部变量是不会进行自动初始化的,所以会出现无法预料的错误
YAMABACK 2005-07-08
  • 打赏
  • 举报
回复
对于Eastunfail说的偶有些不同的意见:每次申明变量,系统都给它分配内存,而这个内存应该是可用的,不会出现无法预料的结果吧
g961681 2005-07-08
  • 打赏
  • 举报
回复
在create(owner)的时候,好象会通知owner做些事情的,
估计50的可能会出异常的!
Eastunfail 2005-07-08
  • 打赏
  • 举报
回复
和nil不一样.你在TEdit.Create的时候,edt的值不是固定的
可能只想一个无法访问的内存空间

所以这样创建的话可能会出现无法预料的异常
saxash 2005-07-08
  • 打赏
  • 举报
回复
to YAMABACK:
对,应该是这样吧。
wtg476 2005-07-08
  • 打赏
  • 举报
回复
----------学习--------
YAMABACK 2005-07-08
  • 打赏
  • 举报
回复
看了一下TComponent的构造函数,edt := TEdit.Create(edt)和TEdit.Create(nil)应该是一样的,因为此时edt还没有被创建就被引用了

16,749

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧