Showstr(TAObj.Create)中创建的TAObj对象生死的问题

sysuye 2014-01-09 03:22:56
最近看刘艺老师的书《delphi面向对象编程思想》,里面有一段程序是类似这样的:
TFrom1.Showstr(AObj:TObj);
begin
AObj.ShowName;
end;
//.......下面是按钮事件
TForm1.button1click(Sender:TObject);
begin
Showstr(TObj.Create);
end;
//.......下面是TObj.ShowName
TObj.ShowName;
beign
showmessage('Tom');
end;

在上面的按钮事件中,Showstr(TObj.Create)里TObj.Create创建了一个对象实例,但刘艺老师并没有显示地调用Free或destroy函数销毁对象,让我不得其解,故在此请教:刘艺老师为什么不销毁按上面Showstr(TObj.Create)方式创建的对象实例?应该怎么理解这种创建方式对象的生死?
注:TObj=class(TObject);
...全文
134 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
sololie 2014-01-09
  • 打赏
  • 举报
回复
咋还不结贴啊,还有啥疑惑啊。。。 俺再注释个清晰的例子

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  // 定义一个基类
  TObj = class
  private
    FObjName: string;
  public
    property ObjName: string read FObjName write FObjName;
    procedure ShowName;
    constructor Create; overload;
    constructor Create(name: string); overload; // 重装构造函数,以提供一种可选的初始化方式
  end;

  // 定义两个TObj的子类
  TObj1 = class(TObj) end;
  TObj2 = class(TObj) end;

  TForm1 = class(TForm)
    btn1: TButton;
    procedure btn1Click(Sender: TObject);
  public
    procedure Showstr(AObj: TObj);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TObj }

constructor TObj.Create;
begin
end;

constructor TObj.Create(name: string);
begin
  FObjName := name;
end;

procedure TObj.ShowName;
begin
  ShowMessage(FObjName);
end;

{ TForm1 }

procedure TForm1.Showstr(AObj: TObj);
begin
  AObj.ShowName;
end;

procedure TForm1.btn1Click(Sender: TObject);
var
  o1: TObj1;
  o2: TObj2;
begin
  // btn1Click 函数中创建了 o1,o2两个对象,
  // 所以,o1,o2 的释放由 btn1Click 函数负责
  // 这就是所谓的“谁创建,谁销毁”的原则

  o1 := TObj1.Create('马桶'); // 用构造函数初始化 ObjName
  o2 := TObj2.Create;
  o2.ObjName := '热翔'; // 通过对对象属性赋值来初始化 ObjName

  // 通过多态性,能正确显示不同的对象名(基于基类的继承类)
  Showstr(o1);
  Showstr(o2);

  // 释放对象
  o1.Free;
  o2.Free;
end;

end.

sololie 2014-01-09
  • 打赏
  • 举报
回复
所以前面我不是说了么,为了突出重点(讲解多态性)有意无意地漏掉的,这个对象肯定是没有释放的,你得在不需要时释放它。 但是你的这个代码是有问题的 TFrom1.Showstr(AObj:TObj); beign AObj.ShowName; AObje.free; // 这个从参数的来的aobje对象应当在函数的外部释放 // 但你在这里释放,代码上是没问题,不过会让使用者产生困惑 end; 应该类似下面这样,遵循一个原则,谁创建谁释放 var obj1:Tobj1; obj2:Tboj2; begin obj1:=tboj1.create; obj2:=tobj2.create; showstr(obj1); // obj1对象不是在showstr中创建的,所以obj1不应该由showstr函数释放 obj1.free; // 这里free对应上面的create showstr(obj2);// 这里free对应上面的create obj2.free; end;
seagull327 2014-01-09
  • 打赏
  • 举报
回复
只是没有放在button1click事件里Free吧, 你提供的代码TObj并非一个局部类变量,其它地方还有引用吧,应该在其它事件来完成它的Free
sysuye 2014-01-09
  • 打赏
  • 举报
回复
引用 4 楼 sololie 的回复:
我说么,就像是讲多态的嘛 而且你说的这个“对象的生于死”这个词汇我倒是有印象,所以直接目录里去找生死一词的页面了
是啊,说多态的,但那种创建方式不销毁对象可以吗?还是应该在TFrom1.Showstr(AObj:TObj);里加上一句: TFrom1.Showstr(AObj:TObj); begin AObj.ShowName; AObj.Free; //......这是新加的 end;
sysuye 2014-01-09
  • 打赏
  • 举报
回复
引用 3 楼 sololie 的回复:
翻了下书,没找到你说的类似的代码。 不过看你的代码,对面没有释放这是肯定的,可能是笔漏,更可能是故意精简代码来突出要说明的问题,这里的代码更像是讲解多态的,而非讲解对象的生命周期的。
第5章 深入多态,第209页示例程序5-6……
sololie 2014-01-09
  • 打赏
  • 举报
回复
我说么,就像是讲多态的嘛 而且你说的这个“对象的生于死”这个词汇我倒是有印象,所以直接目录里去找生死一词的页面了
sololie 2014-01-09
  • 打赏
  • 举报
回复
翻了下书,没找到你说的类似的代码。 不过看你的代码,对面没有释放这是肯定的,可能是笔漏,更可能是故意精简代码来突出要说明的问题,这里的代码更像是讲解多态的,而非讲解对象的生命周期的。
sysuye 2014-01-09
  • 打赏
  • 举报
回复
引用 1 楼 sololie 的回复:
俺对这些代码都没啥印象了。。。 书中哪一页的,得看看书里的上下文
第5章 深入多态,第209页示例程序5-6 上面的代码不是原代码,我自己参照书本打的……
sololie 2014-01-09
  • 打赏
  • 举报
回复
俺对这些代码都没啥印象了。。。 书中哪一页的,得看看书里的上下文

16,748

社区成员

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

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