在TOmniMessage中释放嵌入对象的正确方法是什么?

时间:2014-03-10 14:30:14

标签: delphi delphi-xe5 omnithreadlibrary

我的任务是发送带有数据的各种消息。

例如:

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释放的正确处理是什么?

2 个答案:

答案 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时释放对象,因此您不必再担心内存管理了。