繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM