【问题标题】:What is the correct way to free embed object in TOmniMessage?在 TOmniMessage 中释放嵌入对象的正确方法是什么?
【发布时间】:2014-03-10 14:30:13
【问题描述】:

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

例如:

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

【问题讨论】:

    标签: delphi delphi-xe5 omnithreadlibrary


    【解决方案1】:

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

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

    所以你应该这样做:

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

    或者在纯指针的情况下

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2011-12-13
        • 1970-01-01
        • 1970-01-01
        • 2013-03-21
        • 1970-01-01
        • 2011-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多