我的任务是发送带有数据的各种消息。
例如:
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释放的正确处理是什么?
答案 0 :(得分:1)
您必须处理释放TOmniMessage所持有的对象。至少据我所知。简单类型没有问题,因为引用计数,接口也会自行清楚。但是对于纯指针和TObject后代,你必须对它们进行免费调用。你必须照顾他们使用的记忆。
TOmniMessage只包含指向它们使用的实际内存的引用指针。
所以你应该做那样的事情:
msg.MsgData.AsObject.Free;
msg.MsgData.Clear;
或纯指针
FreeMem(msg.MsgData.AsPointer)
msg.MsgData.Clear;
我也忘了添加。只有当你对他们指向的记忆负责时才这样做:)
答案 1 :(得分:0)
msg.MsgData是一个TOmniValue。在最新版本的OmniThreadLibrary中,TOmniValue可以通过设置TOmniValue.OwnsObject:= True来拥有其对象,并具有一些其他辅助方法来促进此功能。如果OwnsObject为true,则在释放TOmniValue时释放对象,因此您不必再担心内存管理了。