【问题标题】:Delphi collection of objectsDelphi 对象集合
【发布时间】:2017-01-27 14:02:55
【问题描述】:

我创建了一个名为TIstruzione 的简单类;我需要在运行时创建 4 个对象并将它们存储在一个数组中,以便我可以在需要时访问它们。

FList: TObjectList<TIstruzione>;

我在 TForm1 的公共部分创建了这个,因为我在 Delphi 的文档中看到这是一个合适的类通用容器。那我就这样管理他的一生:

procedure TForm1.FormCreate(Sender: TObject);
begin
 FList.Create;
 FList.OwnsObjects := true;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 FList.Destroy;
end;

OwnsObject 确保对象归列表所有,当我释放列表时,里面的对象也被释放。我说的对吗?

如果您查看此处的代码,我正在尝试填充列表:

procedure TForm1.Button1Click(Sender: TObject);
var a: TIstruzione;
begin

 a := TIstruzione.Create;
 try
  a.tipo := Add;
  a.rdest := 2;
  a.dato1 := 7;
  a.dato2 := 5;
  FList.Add(a);
 finally
  a.Free;
 end;

  a := TIstruzione.Create;
 try
  a.tipo := Load;
  a.rdest := 1;
  a.dato1 := 2;
  a.dato2 := -1;
  FList.Add(a);
 finally
  a.Free;
 end;

end;

程序启动时出现错误。这是访问冲突;任何想法?为了完整起见,这个类就是这样的:

type

 TTipo = (RISC_Add, RISC_AddI, RISC_Sub, RISC_SubI, RISC_Load, RISC_Store);
 TPip = (MIPS_pipeline, PPC_pipeline);

type
 TIstruzione = class
  public
   tipo: TTipo;
   rdest: integer;
   dato1: integer;
   dato2: integer;
 end;

【问题讨论】:

  • 我认为你不应该在 TForm1.Button1Click 中释放 a
  • 为什么不呢?该值在释放之前存储在 FList 中
  • 你不想释放它,因为它归 FLIst 所有,在你释放 FList 时会被销毁。
  • 啊,好吧,所以我不需要尝试终于正确了吗?
  • 是的,创建对象并将其添加到列表中,当列表被释放时,所有对象都会自动销毁。另外注意OwnsObjects默认为true,不需要指定这个

标签: delphi


【解决方案1】:

做到这一点:

FList := TObjectList<TIstruzione>.Create;

你不应该在变量上调用Create,总是使用正确的构造函数语法,就像上面一样。

另外,不要Free你刚刚添加到列表中的项目:

procedure TForm1.Button1Click(Sender: TObject);
var 
  a: TIstruzione;
begin
  a := TIstruzione.Create;
  a.tipo := Add;
  a.rdest := 2;
  a.dato1 := 7;
  a.dato2 := 5;
  FList.Add(a);

  a := TIstruzione.Create;
  a.tipo := Load;
  a.rdest := 1;
  a.dato1 := 2;
  a.dato2 := -1;
  FList.Add(a);
end;

TObjectList 现在是所有者,所以这些对象将被TObjectList 释放,不应再由你释放。这就是OwnsObjects := True; 的意思。

【讨论】:

  • 不用等,这是一个 TObjectList
  • 程序在 TButton1 点击时也会崩溃
  • 好的,谢谢鲁迪。只是一件事:您正在调用 TIstruzione.Create 两次!我的意思是,不是已经创建了吗?
  • 我不需要创建 2 个不同的变量吗?
  • 是的,我明白了,你刚刚拯救了 raffaele 的一天
猜你喜欢
  • 2011-03-28
  • 1970-01-01
  • 1970-01-01
  • 2018-12-23
  • 1970-01-01
  • 2018-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多