Есть ли какая-то автоматическая очистка, о которой я не знаю?
Да.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
или использовать его для других целей, если это необходимо.