【问题标题】:TIdTCPServer's TIdContext->Data odd behaviourTIdTCPServer 的 TIdContext->Data 奇怪行为
【发布时间】:2019-04-11 12:01:32
【问题描述】:

为了向多个客户端发送数据,我在OnConnect 中创建了一个TIdThreadSafeStringList 并将其分配给AContext->Data,就像这样

AContext->Data = new TIdThreadSafeStringList

当客户端断开连接时,它的字符串列表在OnDisconnect中被删除,就像这样

delete AContext->Data

但是,这会导致 AV。如果我将参数归零,就像这样

delete AContext->Data
AContext->Data = NULL

AV 消失。是否有一些我不知道的自动清理?

使用 C++ Builder 10.2.3。

【问题讨论】:

    标签: c++builder indy


    【解决方案1】:

    是否有一些我不知道的自动清理功能?

    是的。 TIdContext 派生自 TIdTask,它拥有 Data 属性。 TIdTask 析构函数在OnDisconnect 事件之后调用,如果Data 对象不是NULL,则将其释放。

    处理这种情况的另一种(首选)方法是从 TIdServerContext 派生一个新类,并将您的 TIdThreadSafeStringList 添加到该类(以及您想要的任何其他每个客户端的自定义功能),例如:

    class TMyContext : public TIdServerContext
    {
    public:
        TIdThreadSafeStringList *MyList;
    
        __fastcall TMyContext(TIdTCPConnection *AConnection, TIdYarn *AYarn, TIdContextThreadList *AList = NULL)
            : TIdServerContext(AConnection, AYarn, AList)
        {
            MyList = new TIdThreadSafeStringList;
        }
    
        __fastcall ~TMyContext()
        {
            delete MyList;
        }
    
        //...
    };
    

    然后在激活服务器之前,在运行时将你的类类型分配给服务器的ContextClass 属性,例如:

    __fastcall TMyForm::TMyForm(TComponent *Owner)
        : TForm(Owner)
    {
        IdTCPServer1->ContextClass = __classid(TMyContext);
        //...
    }
    

    然后,您可以简单地将属于服务器的任何 TIdContext* 指针类型转换为您的类类型,以便访问 TIdThreadSafeStringList(或其他功能):

    static_cast<TMyContext*>(SomeIdContext)->MyList->...
    

    这样,您可以完全忽略TIdContext::Data 属性,或根据需要将其用于其他目的。

    【讨论】:

    • "在 OnDisconnect 事件之后调用 TIdTask 析构函数,如果 Data 对象不为 NULL,将释放它。" - 我读过(除了最后一部分关于它不是NULL)但不明白。如果它不知道它是什么,它如何释放对象?
    • @MikeVersteeg 它不需要知道对象的类型。所有对象都派生自TObject,而TObject 有一个虚拟析构函数。 Data 是一个TObject 指针,通过TObject 基指针释放对象是一种安全操作,无论对象的实际类型如何,该对象都将被正确销毁。这是多态性的关键特征之一。
    猜你喜欢
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    相关资源
    最近更新 更多