ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Утечка памяти (C++ Builder 2006)
  #1  
Старый 28.02.2010, 17:06
M_script_
Постоянный
Регистрация: 29.10.2008
Сообщений: 306
Провел на форуме:
1819761

Репутация: 180
Отправить сообщение для M_script_ с помощью ICQ
По умолчанию Утечка памяти (C++ Builder 2006)

При работе программы постоянно увеличивается объем используемой памяти. Происходит это очень медленно, но все же где-то есть утечка. Не могу понять в чем проблема. Ниже код потока. Там где код1 и код2 нет никаких объявлений переменных, только использование методов класса AnsiString (::Pos(), :elete(), ::SubString()) и несколько циклов while();

Код:
unsigned long __stdcall work_thr(void*)
{
	FILE* fSave;
	AnsiString sFormat = "file001";
	AnsiString sData = "";
	int iCount = 1000;

	while(!bComplete)
	{
		//тут код1
		
		for(int j = 0; j < iCount; ++j)
		{
			//тут код2
			
			fSave = fopen((sFormat + ".txt").c_str(), "a");
			if(fSave)
			{
				fputs((sData + "\n").c_str(), fSave);
				fclose(fSave);
			}
		}
	}
	return 0;
}
В чем может быть проблема?
 
Ответить с цитированием

  #2  
Старый 28.02.2010, 17:12
d_x
Reservists Of Antichat - Level 6
Регистрация: 25.03.2008
Сообщений: 670
Провел на форуме:
4137635

Репутация: 2407


По умолчанию

Если поток создается с помощью CreateThread, то вместо return 0 надо бы использовать ExitThread(0).
 
Ответить с цитированием

  #3  
Старый 28.02.2010, 17:20
M_script_
Постоянный
Регистрация: 29.10.2008
Сообщений: 306
Провел на форуме:
1819761

Репутация: 180
Отправить сообщение для M_script_ с помощью ICQ
По умолчанию

Цитата:
Сообщение от d_x  
Если поток создается с помощью CreateThread, то вместо return 0 надо бы использовать ExitThread(0).
Утечка в цикле while(!bComplete), используемая память увеличивается во время работы, когда все потоки активны.
Но все равно спасибо, поправлю это.
 
Ответить с цитированием

  #4  
Старый 02.03.2010, 12:41
sn0w
Статус пользователя:
Регистрация: 26.07.2005
Сообщений: 568
Провел на форуме:
1290766

Репутация: 1236


По умолчанию

попробуй обойтись без AnsiString
__________________


snow white world wide
 
Ответить с цитированием

  #5  
Старый 02.03.2010, 14:24
GhostOnline
Участник форума
Регистрация: 20.12.2008
Сообщений: 277
Провел на форуме:
828081

Репутация: 84
По умолчанию

А ты на все 100% уверен что тут вообще есть утечка?
Я к тому, что когда-то тоже так в ДЗ винды смотрел думал есть утечка в прграмме.
Потом установил тулзу встраивающуюся в код, погонял прогу с нею - утечек не нашлось.
При этом для теста тут же написал код с утечкой - успешно детектировала.
Вообще в ДЗ не так то просто детектировать memory leaks, там не все так очевидно как кажется на первый взгляд.
 
Ответить с цитированием

  #6  
Старый 02.03.2010, 14:27
razb
Постоянный
Регистрация: 24.03.2009
Сообщений: 670
Провел на форуме:
2868783

Репутация: 414


Отправить сообщение для razb с помощью ICQ
По умолчанию

Прогони через valgrind и увидишь в каком месте утечка, да лучше std строки юзать.
 
Ответить с цитированием

  #7  
Старый 02.03.2010, 18:02
desTiny
Reservists Of Antichat - Level 6
Регистрация: 04.02.2007
Сообщений: 1,152
Провел на форуме:
3008839

Репутация: 1502


По умолчанию

Цитата:
Сообщение от d_x  
Если поток создается с помощью CreateThread, то вместо return 0 надо бы использовать ExitThread(0).
зачем?
__________________
Bedankt euch dafür bei euch selbst.

H_2(S^3/((z1, z2)~(exp(2pi*i/p)z1, exp(2pi*q*i/p)z2)))=Z/pZ
 
Ответить с цитированием

  #8  
Старый 02.03.2010, 20:34
Gar|k
Постоянный
Регистрация: 20.03.2009
Сообщений: 564
Провел на форуме:
991929

Репутация: 395


По умолчанию

ога d_x Рихтер пишет
Цитата:
Завершение потока
Поток можно завершить четырьмя способами:

- функция потока возвращает управление (рекомендуемый способ);
- поток самоуничтожается вызовом функции ExitThread(нежелательный способ);
- один из потоков данного или стороннего процесса вызывает функцию TerminateThread (нежелательный способ);
- завершается процесс, содержащий данный поток (тоже нежелательно).
В этом разделе мы обсудим перечисленные способы завершения потока, а также рассмотрим, что на самом деле происходит в момент его окончания.

Возврат управления функцией потока
Функцию потока следует проектировать так, чтобы поток завершался только после того, как она возвращает управление. Это единственный способ, гарантирующий корректную очистку всех ресурсов, принадлежавших Вашему потоку. При этом:

- любые С++-объекты, созданные данным потоком, уничтожаются соответствующими деструкторами;
- система корректно освобождает память, которую занимал стек потока;
- система устанавливает код завершения данного потока (поддерживаемый объектом ядра "поток") — его и возвращает Ваша функция потока;
- счетчик пользователей данного объекта ядра "поток" уменьшается на 1.
Функция ExitThread
Поток можно завершить принудительно, вызвав:

VOID ExitThread(DWORD dwExitCode);
При этом освобождаются все ресурсы операционной системы, выделенные данному потоку, но C/C++ - ресурсы (например, объекты, созданные из С++-классов) не очищаются. Именно поэтому лучше возвращать управление из функции потока, чем самому вызывать функцию ExitThread...
 
Ответить с цитированием

  #9  
Старый 08.03.2010, 01:50
GhostOnline
Участник форума
Регистрация: 20.12.2008
Сообщений: 277
Провел на форуме:
828081

Репутация: 84
По умолчанию

Ну что ТС, нашел утечку?

ЗЫ Это не флуд, реально интересно
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
4 и более GB ОЗУ для ОС Windows (32/64) NetSter Аппаратное обеспечение 10 28.12.2009 20:11
Сколько всего разделов памяти ? GenTao С/С++, C#, Delphi, .NET, Asm 1 11.10.2009 00:04
Преодолевая ограничения Windows: физическая память jawbreaker Чужие Статьи 1 16.02.2009 02:12
асм, дизасм, принцип работы процов на определенном уровне. Cthulchu Аппаратное обеспечение 0 05.01.2009 20:14



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ