社区
语言基础/算法/系统设计
帖子详情
组件的Owner如果是其自身?
saxash
2005-07-08 03:28:09
看到一段代码使我迷惑:
var
edt: TEdit;
begin
edt := TEdit.Create(edt);
...
end;
这样的组件,如果没有手动释放,将如何?
在此情况下,是否相当于TEdit.Create(nil); ?
...全文
219
19
打赏
收藏
组件的Owner如果是其自身?
看到一段代码使我迷惑: var edt: TEdit; begin edt := TEdit.Create(edt); ... end; 这样的组件,如果没有手动释放,将如何? 在此情况下,是否相当于TEdit.Create(nil); ?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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还没有被创建就被引用了
notepad:Nive - 记事本。 一个简单的云记事本来管理个人笔记
如果您想设置自己的记事本或使用它作为开始试用该平台,请按照下一节中描述的步骤操作。 Nive后端配置 记事本的后端需要设置和配置以下三个
组件
: DataStorage:命名notes ,存储笔记的数据库 Keys + Validators: ...
考试成绩统计系统
考试用golang语言实现的考试成绩统计系统项目规范每个目录需要有独立的README.md目录内容说明CHANGELOG.md版本说明文件CONTRIBUTORS.md贡献者说明...:当前目录的这三个文件以后每个业务或基础
组件
维护自己的版本号...
19.3rac_生产RHEL7_ORACLE19C_安装详细实战步骤+打19.4补丁
在本地自己的操作系统上,完全模拟生产环境,让学员跟着视频一步一步搭建一套在RHEL7操作系统上面的oracle19c的rac环境。同时学员还会学会DNS服务器,DNS客户端,NTP服务器,NTP客户端等操作系统知识。让学员在短时间...
alpine-docker:自定义alpine-docker容器
项目名称:alpine-docker容器build代码 项目规范 1,每个目录 需要有独立...2,以后每个业务或者基础
组件
维护自己的版本号,在CHANGELOG.md中,版本构建以后的tag关联成自己的版本号; 负责人信息 . └──
Owner
: carlo
组件
化及架构设计
关于
组件
化 网上
组件
化的文章很多。很多文章一提到
组件
化,就会说解耦,一说到解耦就会说路由或者runtime。好像
组件
化 == 解耦 == 路由/Runtime,然而这是一个非常错误的观念。持有这一观点的人,没有搞清楚在
组件
...
语言基础/算法/系统设计
16,749
社区成员
33,245
社区内容
发帖
与我相关
我的任务
语言基础/算法/系统设计
Delphi 语言基础/算法/系统设计
复制链接
扫一扫
分享
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章