[英]What is the correct way to free embed object in TOmniMessage?
我的任务是发送各种带有数据的消息。
例如:
task.Comm.Send(MSG_JOB_ERROR,[string, string,string,string,string, TObject]) ;
在接收方,我有
procedure TUDPBroadCast.OnWorkerJobError(var msg: TOmniMessage);
var
s : String ;
begin
try
s := 'TASK: ' + msg.MsgData.AsArrayItem[0].AsString + ', IP: ' +
msg.MsgData.AsArrayItem[1].AsString + ', PORT: ' +
msg.MsgData.AsArrayItem[2].AsString +
', DATA: ' + msg.MsgData.AsArrayItem[3].AsString + ', REPLY: '+
msg.MsgData.AsArrayItem[4].AsString ;
Xlog('JOB ERROR > ' + s, 'UDPBroadCast') ;
processworkobject(msg.MsgData.AsArrayItem[4].AsObject) ;
finally
msg.MsgData.Clear ;
end;
end;
但是我不认为MsgData.Clear会正确地取消分配所有内存。
TomniValue释放的正确处理方法是什么?
您必须注意释放TOmniMessage持有的对象。 至少据我所知。 简单类型是没有问题的,由于引用计数,接口本身也很清晰。 但是对于纯指针和TObject后代,您必须对其进行免费调用。 您必须照顾他们使用的内存。
TOmniMessage仅包含指向它们所使用的实际内存的引用指针。
因此,您应该执行以下操作:
msg.MsgData.AsObject.Free;
msg.MsgData.Clear;
或在纯指针的情况下
FreeMem(msg.MsgData.AsPointer)
msg.MsgData.Clear;
我也忘了补充。 仅当您对内存负责时才这样做:)
msg.MsgData是TOmniValue。 在OmniThreadLibrary的最新版本中,TOmniValue可以通过设置TOmniValue.OwnsObject:= True来拥有其对象,并具有一些其他辅助方法来简化此功能。 如果OwnsObject为true,则在释放TOmniValue时释放对象,因此您不必再担心内存管理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.