0

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

例如:

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

4

2 回答 2

1

您必须注意释放 TOmniMessage 持有的对象。至少据我所知。简单类型没问题,接口也因为引用计数而自己变得清晰。但是对于纯指针和 TObject 后代,您必须对其进行免费调用。你必须照顾他们使用的内存。

TOmniMessage 仅包含指向它们使用的实际内存的引用指针。

所以你应该这样做:

msg.MsgData.AsObject.Free;
msg.MsgData.Clear;

或者在纯指针的情况下

FreeMem(msg.MsgData.AsPointer)
msg.MsgData.Clear;

我也忘了补充。仅当您对他们指向的内存负责时才这样做:)

于 2014-03-11T10:28:52.647 回答
0

msg.MsgData 是一个 TOmniValue。在最新版本的 OmniThreadLibrary 中,TOmniValue 可以通过设置 TOmniValue.OwnsObject:=True 来拥有它的对象,并且有一些其他的辅助方法来促进这个功能。如果 OwnsObject 为真,则在释放 TOmniValue 时释放对象,因此您不必再担心内存管理。

于 2014-03-13T04:19:58.190 回答