Очистка памяти после потока
От: olegto  
Дата: 29.01.07 13:06
Оценка:
Создаю структуру, отправляйю в поток, поток обрабатывает и взвращает ее.
При закрытии программы CodeGuru ругается на то что память не от-delete-ина.

Resource leak in process: Project1.exe(3372)  - C:\Oleg\B_Sorces\SNMP\Tread\SNMP_rutine.h#734  The object array (0xF78E38) was never deleted
The object array (0xF78E38) was never deleted
The object array (0x00F78E38) [size: 16 bytes] was created with new[]
0x004078F1 - C:\Oleg\B_Sorces\SNMP\Tread\SNMP_rutine.h#734
0x7C80B683


Вопрос в том где и когда я должен ее убивать ?



Структура:
struct SNMP_IP_Table
{
AnsiString Host;
AnsiString Community;
int retries;
int timeout;
int Return_Status;
AnsiString Error_Description;
int Count;
AnsiString *AdEntAddr;
AnsiString *AdEntIfIndex;
AnsiString *AdEntNetMask;
};


Заполнение, запуск и отображение:
SNMP_IP_Table * IP_Table;
...

void __fastcall TForm1::Button8Click(TObject *Sender)
{
IP_Table = new SNMP_IP_Table;

IP_Table->Host = ComboBox1->Text;
IP_Table->Community = "public";
IP_Table->timeout = 1000;
IP_Table->retries = 1;

IP_Table_Thread=CreateThread(NULL,0,GetIP_Table,(LPVOID)IP_Table,0,&IP_Table_ThreadId);


ULONG IP_T;
do    {
    GetExitCodeThread(IP_Table_Thread, &IP_T);
    Sleep(200);
    Application->ProcessMessages();
    if(IP_T != STILL_ACTIVE) Label1->Caption = "IP_Table_Thread - OK";

while (IP_T == STILL_ACTIVE);

TerminateThread(IP_Table_Thread, IP_Table_ThreadId);
IP_Table_Thread=NULL;

Memo1->Lines->Add("IP_Table");
for (int i = 0; i <= IP_Table->Count; i++)
    {
    Memo1->Lines->Add("");
    Memo1->Lines->Add(IntToStr(i) + " Addr " + IP_Table->AdEntAddr[i]);
    Memo1->Lines->Add(IntToStr(i) + " NetMask " + IP_Table->AdEntNetMask[i]);
    Memo1->Lines->Add(IntToStr(i) + " IfIndex " + IP_Table->AdEntIfIndex[i]);
    }

}



Поток:
unsigned long __stdcall  GetIP_Table(void * par)
{

...
IP_Table->Count = VarDim;
IP_Table->AdEntAddr = new AnsiString[VarDim+1];
IP_Table->AdEntIfIndex = new AnsiString[VarDim+1];
IP_Table->AdEntNetMask = new AnsiString[VarDim+1];
...

}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.