关于一个初学者DELPHI的几个小问题:

LWWANDVB 2000-06-30 06:54:00
我是一名DELPHI的新手,曾学过C++,但对DELPHI中的有些问题还是不明白,还得请DELPHI老手们的帮助:
1、如两个相同类的对象指针互相赋值,例:
type
c=class
……
end;

var o1,o2:c;
begin
o1:=c.create;
o2:=c.create;

o2:=o1;
end;

这样,o2就会指向o1,那会不会做成o2原来指向的内存丢失呢?o2会不会先自动调用Destructor?

2、对象复制问题:
对象变量是指针类型。o2:=o1也只是把指针值赋值,不是真正的对象复制,要实现对象复制,是不是应该编写一个方法来实现对象的复制?有没有更简单的办法?

3、对象自动释放问题:
例(将上面主程序改为):
begin
o1:=c.create;
end;
程序执行后o1会不会自动调Destructor释放?

4、析构器问题:
是不是一个类中定义了指针成员(包括对象变量)就非要有一个析构器不可?析构器是不是一定要用Inherited来调父类的析构器以完全保证释放对象?



...全文
131 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
SuperMMX 2000-07-13
  • 打赏
  • 举报
回复
1, 指向同一个, 原来的不会释放
2, 一般有 assign 方法.
3, 应该不会.
4, 不一定非得自己写 ceate, 如果你的类里没有要创建的东西, 就不用
应该是的.
dudo 2000-07-01
  • 打赏
  • 举报
回复
你的四个问题,可以归结为两个问题

1.对象的拆构,
一个对象要拆构,只在以下情况下发生:
a.显式调用Destructor,或free或 destroy,
b.程序结束,系统自动释放。
对于一些创建时有宿主的对象,如Tform对象,并不需要显式的释放他,当它的宿主对
象被释放时,他也会被释放,但也有例外,看下例:
From1:=Tform.create(application);
(程序结束,是自动释放);
Form1:=Tform.create(nil);
(需要手工释放);
第一例form1的宿主是application,当程序结束时,application会调用它的destroy方法,每一个可以作为宿主对象的对象都有一个对象列表属性,它的destroy方法
逐一调用它的对象列表中的对象的destroy方法,所以你的第四个问题中的 在拆构时调用iinherited很有必要的, 也是最安全的.忽略这些问题,会造成内存泄漏,使得程序每运行一次,系统资源减少一次,直到最后系统特别的慢,直到崩溃。
第二例form1的宿主为nil,也就是没有宿主,这样就需要自己来解决释放问题。
一般使用try finally end 结构。
2.对象的赋值与复制。
对象是一个指针,但他和指针不同, 在你的问题1 中o2:=o1 实际上就是对象的复制,这也是对象和指针不同的地方,在使用过程中尽量要避免这种情况的发生,对象的复制
有时会占用很大的内存,消耗系统资源。一般的要进行对象的复制都是调用对象的assign()方法。你可以看一下assign方法实现的原码。
看了以上的介绍,我向你应该自己能够对你的问题有个答案。如果还不明白,我可以下次在给你说明白点。

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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