TObjectList和TStringlist删除对象的区别

wangwei244157887 2014-05-14 04:30:09
下面是代码定义,请问为什么用TObjectList.delete的方法会报错,而用tStringlis他.delete方法不报错呢?

PRec=^TRec;
TRec=record
a:Integer;
b:Integer;
end;
procedure TForm1.RzButton2Click(Sender: TObject);
var
onex,oney:TRec;
List:TObjectlist;
strList:TStringList;
aone:TRec;
begin
{try
onex.a:=1;
onex.b:=2;
oney.a:=3;
oney.b:=4;
List:=TObjectList.Create;
List.Add(@onex) ;
List.Add(@oney);
List.Delete(0); //执行这句话报错,为什么
aone:=Prec(List[0])^;
ShowMessage(IntToStr(aone.a));
finally
List.Free;
end; }
try
onex.a:=1;
onex.b:=2;
oney.a:=3;
oney.b:=4;
strList:=TStringList.Create;
strList.AddObject('onex',@onex) ;
strList.AddObject('oney',@oney);
strList.Delete(0);
aone:=Prec(strList.Objects[0])^;
ShowMessage(IntToStr(aone.a));
finally
strList.Free;
end;

end;
...全文
344 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
lght 2014-05-15
  • 打赏
  • 举报
回复
TObjectList删除是会自动释放添加的对象,TStringList删除时不会自动释放关联的对象 record应该用TList保存
cqs6616 2014-05-14
  • 打赏
  • 举报
回复
TObjectList创建时有参数可以设置 删除时 是否Free。
xhz8000 2014-05-14
  • 打赏
  • 举报
回复
建议楼主看看VCL源代码把! tStringlist,addObject 是一个记录数据。 TObjectlist 这个加入的是一个对象指针。 在deleted 的时候 Notify(Temp, lnDeleted); 然后调用 if OwnsObjects then if Action = lnDeleted then TObject(Ptr).Free; inherited Notify(Ptr, Action); 这个过程跟 tStringlist 是不同的
pathletboy 2014-05-14
  • 打赏
  • 举报
回复
引用 12 楼 wangwei244157887 的回复:
[quote=引用 10 楼 pathletboy 的回复:] Adds a string to the list, and associates an object with the string. 将字符串加入列表,并且关联一个对象到字符串。 红字是翻译。
这个关联是什么意思呢[/quote] 一切尽在代码中
function TStringList.AddObject(const S: string; AObject: TObject): Integer;
begin
  if not Sorted then
    Result := FCount
  else
    if Find(S, Result) then
      case Duplicates of
        dupIgnore: Exit;
        dupError: Error(@SDuplicateString, 0);
      end;
  InsertItem(Result, S, AObject);
end;
procedure TStringList.InsertItem(Index: Integer; const S: string; AObject: TObject);
begin
  Changing;
  if FCount = FCapacity then Grow;
  if Index < FCount then
    System.Move(FList^[Index], FList^[Index + 1],
      (FCount - Index) * SizeOf(TStringItem));
  with FList^[Index] do
  begin
    Pointer(FString) := nil;
    FObject := AObject;
    FString := S;
  end;
  Inc(FCount);
  Changed;
end;
  PStringItem = ^TStringItem;
  TStringItem = record
    FString: string;
    FObject: TObject;
  end;
他创建了TStringItem对象用于关联String和你的对象,最终Delete的时候将会释放这个TStringItem对象,但是你自己添加的对象不会被释放。
武稀松 2014-05-14
  • 打赏
  • 举报
回复
你都知道是TObjectList,那里面为啥还要放结构体指针? 放的应该是对象才对
pathletboy 2014-05-14
  • 打赏
  • 举报
回复
引用 11 楼 wangwei244157887 的回复:
[quote=引用 8 楼 pathletboy 的回复:] [quote=引用 7 楼 wangwei244157887 的回复:] [quote=引用 5 楼 pathletboy 的回复:] 请指出哪里不对?你试试if String is TObject then 能不能编译通过就知道String对象到底是不是TObject对象了。
我的意思是tStringlist,addObject也是添加的对象啊[/quote] 对呀,是关联对象, associates这个单词是关联的意思,他和string关联,添加进去后,delete不会释放所关联的对象的,要想解决心中疑惑,请自己看TObjectList.Delete 和 TStringList.Delete这2个方法。[/quote] 那如果用tStringlist做的的话,不就是对象会一直存在内存中吗?即使删除了[/quote] 你的结构体对象是局部变量,所以,函数结束,你的结构体对象就释放了。如果你使用new方式创建结构体对象,你需要在delete后dispose你的结构体对象,否则将会造成内存泄漏。 至于你的问题,你首先要搞明白结构体对象、结构体对象指针、类对象、字符串对象之间的区别。
「已注销」 2014-05-14
  • 打赏
  • 举报
回复
引用 10 楼 pathletboy 的回复:
Adds a string to the list, and associates an object with the string. 将字符串加入列表,并且关联一个对象到字符串。 红字是翻译。
这个关联是什么意思呢
「已注销」 2014-05-14
  • 打赏
  • 举报
回复
引用 8 楼 pathletboy 的回复:
[quote=引用 7 楼 wangwei244157887 的回复:] [quote=引用 5 楼 pathletboy 的回复:] 请指出哪里不对?你试试if String is TObject then 能不能编译通过就知道String对象到底是不是TObject对象了。
我的意思是tStringlist,addObject也是添加的对象啊[/quote] 对呀,是关联对象, associates这个单词是关联的意思,他和string关联,添加进去后,delete不会释放所关联的对象的,要想解决心中疑惑,请自己看TObjectList.Delete 和 TStringList.Delete这2个方法。[/quote] 那如果用tStringlist做的的话,不就是对象会一直存在内存中吗?即使删除了
pathletboy 2014-05-14
  • 打赏
  • 举报
回复
Adds a string to the list, and associates an object with the string. 将字符串加入列表,并且关联一个对象到字符串。 红字是翻译。
「已注销」 2014-05-14
  • 打赏
  • 举报
回复
恩,看到了,为什么同样加载的是Object,但是删除防范不一样呢,按照DLEPHI的帮助说明TStringlist.Adddobject,也是加载对象啊
pathletboy 2014-05-14
  • 打赏
  • 举报
回复
引用 7 楼 wangwei244157887 的回复:
[quote=引用 5 楼 pathletboy 的回复:] 请指出哪里不对?你试试if String is TObject then 能不能编译通过就知道String对象到底是不是TObject对象了。
我的意思是tStringlist,addObject也是添加的对象啊[/quote] 对呀,是关联对象, associates这个单词是关联的意思,他和string关联,添加进去后,delete不会释放所关联的对象的,要想解决心中疑惑,请自己看TObjectList.Delete 和 TStringList.Delete这2个方法。
「已注销」 2014-05-14
  • 打赏
  • 举报
回复
引用 5 楼 pathletboy 的回复:
请指出哪里不对?你试试if String is TObject then 能不能编译通过就知道String对象到底是不是TObject对象了。
我的意思是tStringlist,addObject也是添加的对象啊
pathletboy 2014-05-14
  • 打赏
  • 举报
回复
你自己打开delphi源码比较下TObjectList.Delete 和 TStringList.Delete这2个方法,你就懂了。
pathletboy 2014-05-14
  • 打赏
  • 举报
回复
请指出哪里不对?你试试if String is TObject then 能不能编译通过就知道String对象到底是不是TObject对象了。
「已注销」 2014-05-14
  • 打赏
  • 举报
回复
不对吧,这是帮助上说的 Adds a string to the list, and associates an object with the string. Delphi syntax: function AddObject(const S: string; AObject: TObject: Integer; override; C++ syntax: virtual int __fastcall AddObject(const AnsiString S, System::TObject* AObject);
pathletboy 2014-05-14
  • 打赏
  • 举报
回复
引用 2 楼 wangwei244157887 的回复:
[quote=引用 1 楼 pathletboy 的回复:] 因为TObjectList delete的时候会尝试调用对象的free,你这种应该使用TList,而非TObjectList,只有当你的元素是TObject的时候才建议使用TObjectList
那为什么用tStringlist又不会报错呢,同样是Object 啊[/quote] String对象不是TObject对象,没有Free方法,自然也不会调用Free方法了。
「已注销」 2014-05-14
  • 打赏
  • 举报
回复
引用 1 楼 pathletboy 的回复:
因为TObjectList delete的时候会尝试调用对象的free,你这种应该使用TList,而非TObjectList,只有当你的元素是TObject的时候才建议使用TObjectList
那为什么用tStringlist又不会报错呢,同样是Object 啊
pathletboy 2014-05-14
  • 打赏
  • 举报
回复
因为TObjectList delete的时候会尝试调用对象的free,你这种应该使用TList,而非TObjectList,只有当你的元素是TObject的时候才建议使用TObjectList

16,749

社区成员

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

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