Создаю структуру, отправляйю в поток, поток обрабатывает и взвращает ее.
При закрытии программы 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;
};
Здравствуйте, Аноним, Вы писали:
>>TerminateThread(IP_Table_Thread, IP_Table_ThreadId); А>Поубивал бы
В каком смысле ?
Re[3]: Очистка памяти после потока
От:
Аноним
Дата:
29.01.07 14:59
Оценка:
Здравствуйте, olegto, Вы писали:
>>>TerminateThread(IP_Table_Thread, IP_Table_ThreadId); А>>Поубивал бы O>В каком смысле ?
В случае TermnateThread не вызываются деструкторы объектов, созданных на стеке. И происходят прочие гадости(подробнее — у Рихтера)
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, olegto, Вы писали:
>>>>TerminateThread(IP_Table_Thread, IP_Table_ThreadId); А>>>Поубивал бы O>>В каком смысле ? А>В случае TermnateThread не вызываются деструкторы объектов, созданных на стеке. И происходят прочие гадости(подробнее — у Рихтера)
Без TerminateThread(IP_Table_Thread, IP_Table_ThreadId); CodeGuide также ругается при выходе программы.
Если вручную пытаюсь убить delete[] IP_Table; то происходит "Abnormal program termination".
PS
Если не запускать поток, то delete[] IP_Table; происходит без ошибок.
Re[5]: Очистка памяти после потока
От:
Аноним
Дата:
29.01.07 16:14
Оценка:
Здравствуйте, olegto, Вы писали:
O>Здравствуйте, Аноним, Вы писали:
А>>Здравствуйте, olegto, Вы писали:
>>>>>TerminateThread(IP_Table_Thread, IP_Table_ThreadId); А>>>>Поубивал бы O>>>В каком смысле ? А>>В случае TermnateThread не вызываются деструкторы объектов, созданных на стеке. И происходят прочие гадости(подробнее — у Рихтера)
Ну если программу не запускать, то вообще никто ругаться не будет.
Тоже решение
O>Без TerminateThread(IP_Table_Thread, IP_Table_ThreadId); CodeGuide также ругается при выходе программы.
Потому что объект не уничтожаешь.
O>Если вручную пытаюсь убить delete[] IP_Table; то происходит "Abnormal program termination".
Потому что пытаешься использовать объект после того, как ты его убил.
O>PS O>Если не запускать поток, то delete[] IP_Table; происходит без ошибок.
Потому что ты знаешь, когда тебе больше IP_Table не нужен и не пытаешься его пользовать
после того, когда он уничтожен.
На самом деле что с потоками, что без них правила создания и уничтожения объектов
в куче одинаковы.
Уничтожай объект тогда, когда он не нужен и пытайся его использовать после того,
как он уничтожен. Все просто ведь?
Потоки только усложняют анализ, когда и где что используется.
P.S. Потоки прибивать начильно и в самом деле не надо.
Надо дожидадаться их окончания.
См на WaitForSingleObject