以前一直有C++,现在初学Delphi,关于自定义类的使用求救!

new_stranger 2005-06-23 01:26:00
//我定义的类的文件
unit MyClassUnit;

interface

type
TA = class//(TObject)
public
Mem_1: Integer;
Mem_2: Integer;
constructor Create;
destructor Destroy; override;
end;

TB = class//(TObject)
private
public
Mem_A1: TA;
constructor Create;
destructor Destroy; override;
end;

implementation


constructor TA.Create;
begin
Mem_1 := 10;
Mem_2 := 20;
inherited;
end;

destructor TA.Destroy;
begin
inherited;
end;

constructor TB.Create;
begin
Mem_A1 := TA.Create;
inherited Create;
end;

destructor TB.Destroy;
begin
Mem_A1.Destroy;
inherited Destroy;
end;


end.

//使用定义的类的函数

procedure TClassTestForm.btn1Click(Sender: TObject);
var
ca : TA;
cb : TB;
iTest : Integer;
begin
iTest := 100;
ca := TA.Create;
ca.Mem_1 := iTest;
ca.Mem_2 := iTest;

cb := TB.Create;
iTest := cb.Mem_A1.Mem_1;//当我单步调试时这行好像不运行
iTest := cb.Mem_A1.Mem_2;//当我单步调试时这行好像不运行

iTest := 200;
cb.Mem_A1.Mem_1 := iTest;
cb.Mem_A1.Mem_2 := iTest;

ca.Destroy;
cb.Destroy;
end;

请问这样定义类和使用类有没有内存泄漏或者其它的问题?
...全文
206 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ehom 2005-06-29
  • 打赏
  • 举报
回复
另外你的程序确实比较容易造成内存泄漏,因为不像C++的局部对象,Delphi中的局部对象也是堆内存,也是需要显式释放的。所以你的程序如果中间出现异常就会造成内存泄漏。

比较合理的写法是:

try
ca := TA.Create;
finally
ca.free;
end;
ehom 2005-06-29
  • 打赏
  • 举报
回复
完全和你说的没有关系,很多编译器,不限定语言,都会遇到类似问题,因为默认打开了编译优化。

//iTest := cb.Mem_A1.Mem_1;//当我单步调试时这行好像不运行
//iTest := cb.Mem_A1.Mem_2;//当我单步调试时这行好像不运行

//iTest := 200;

因为iTest的值最终确定了是200,那么前两步作为无用的废代码自然不会编译。

另外你的程序有点问题,OO的重要要素之一是封装,你直接把数据放到public区域是破坏了数据安全性的。数据对外部应该是不可见的。
e5022 2005-06-28
  • 打赏
  • 举报
回复
嗯,推荐使用Free。
在Delphi中Free和Destroy好像相同,实际上Free有很大的优势。就是Free是自动测试对象是否为空nil(对应C/C++里面的NULL),如果不为空就释放对象内存空间,而如果为空就不管了。
使用Destroy则不进行这种验证,如果对象已经释放过或者根本没有创建过,则可能出错。
ExSystem 2005-06-28
  • 打赏
  • 举报
回复
这个东西不用麻烦使用类的!
因为:此类只有数据成员,而没有函数和过程(Create/Destory出外);而且最后不要直接调用ca.Destory;,而应该是ca.Free;。
ExSystem 2005-06-28
  • 打赏
  • 举报
回复
这个东西不用麻烦使用类的!
new_stranger 2005-06-23
  • 打赏
  • 举报
回复
我试了很多次。结果和我前面的一样。
cb := TB.Create;
iTest := cb.Mem_A1.Mem_1;//当我单步调试时这行好像不运行
iTest := cb.Mem_A1.Mem_2;//运行指示光标在这两行就不停留。

iTest := 200; //运行指示光标到达这行时,用Evaluate/Modify查看iTest的值时,
//显示Variable 'iTest' inaccessible here due to optimization

cb.Mem_A1.Mem_1 := iTest;//运行指示光标到达这行时,用Evaluate/Modify查看iTest的值时,
//显示200
cb.Mem_A1.Mem_2 := iTest;

我用的是Delphi7.0+updata1
beyondtkl 2005-06-23
  • 打赏
  • 举报
回复
constructor TA.Create;
begin
Mem_1 := 10;
Mem_2 := 20;
inherited;
end;

一般

constructor TA.Create;
begin
inherited;
Mem_1 := 10;
Mem_2 := 20;
end;

你不是学过C++ 么,C++里面是默认先调用父类的构造函数先初始化 父类子对象的 这样更安全一些。。
paranoia190 2005-06-23
  • 打赏
  • 举报
回复
运行的
何鲁青 2005-06-23
  • 打赏
  • 举报
回复
没错误的,单步调试哪里肯定会运行的,再试一下哈!!!
wycg_cnh20 2005-06-23
  • 打赏
  • 举报
回复
没有任何错误

16,748

社区成员

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

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