Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.09.19;
Скачать: CL | DM;

Вниз

Утечка памяти при динамическом создании форм и UNICODE_CTRLS   Найти похожие ветки 

 
Rocket ©   (2008-10-02 22:39) [0]

По нажатию кнопки на главной форме:
 for i := 0 to 100 do
 begin
   NewForm5(Form5, Applet);
   Form5.Form.Free;
 end;

Диспетчер задач показывает, что память при Free не освобождается.
Количество отъедаеммой памяти сильно зависит от количества контролов.
Без ключа UNICODE_CTRLS всё, вроде бы, нормально.
KOL+MCK 2.88


 
MTsv DN   (2008-10-04 10:46) [1]

Привет...

Проверьте свой код. Все нормально. Только что проверил и при включенной и при выключенной директиве unicode_ctrls. Разницы нет, все освобождается нормально. Было 2.868кБ - Нажатие на кнопку - Выполнение Вашего цикла - стало 2.872кБ.


 
Vladimir Kladov ©   (2008-10-04 12:14) [2]

Диспетчер задач показывает в том числе и память, которая не вернулась от приложения, даже если в данный момент она корректно освобождена и осталась в распоряжении менеджера кучи. Смотреть надо мемпруфом, fastMMx или другими анализаторами утечек.


 
Rocket ©   (2008-10-04 13:33) [3]

MTsv DN,
да, 4 килобайта за один цикл в среднем.
Владимир Кладов,
да, я понимаю, что это не самый лучший анализатор, сейчас проверю мемпруфом.


 
Rocket ©   (2008-10-04 13:52) [4]

memproof 0.9.5.0 показывает рост потребляемых ресурсов в области OLE - SysString. дедукция подсказывает, что это связано со строками :)
без ключа UNICODE_CTRLS роста не наблюдается.


 
Vladimir Kladov ©   (2008-10-04 18:02) [5]

и по окончании программы они оказываются не освобождены?


 
Rocket ©   (2008-10-04 18:18) [6]

да, судя по мемпруфу


 
vampir_infernal   (2008-10-05 09:33) [7]

KOL.PAS 2.88
строка 33800, функция TControl.CreateWindow.
  {$IFNDEF UNICODE_CTRLS}
  StrCopy( Params.WinClsNamBuf, @ SubClassName[ 1 ] );
  {$ELSE}
  lstrcpyW(Params.WinClsNamBuf,StringToOleStr(SubClassName));
  {$ENDIF}

Мемпруф видит, что не освобождается результат функции SysAllocStringLen, которая вызывается внутри StringToOleStr, и согласно справке, должен быть освобожден с помощью SysFreeString.
Попробуйте так:
{$IFNDEF UNICODE_CTRLS}
var tempolestr : PWideChar;
{$ENDIF}
begin
------
  {$IFNDEF UNICODE_CTRLS}
  StrCopy( Params.WinClsNamBuf, @ SubClassName[ 1 ] );
  {$ELSE}
  tempolestr := StringToOleStr(SubClassName);
  lstrcpyW(Params.WinClsNamBuf, tempolestr);
  SysFreeString( tempolestr );
  {$ENDIF}
------
end;


 
vampir_infernal   (2008-10-05 11:19) [8]

{$IFDEF UNICODE_CTRLS}
var tempolestr : PWideChar;
{$ENDIF}

fixed


 
Rocket ©   (2008-10-06 08:54) [9]

vampir_infernal,
спасибо, мемпруф теперь доволен. этот фикс надо в тему про 2.88.
но диспетчер задач всё-таки показывает увеличение выделенной памяти. поставил в цикл миллион, выделенная память дошла до 100 мегабайт, дальше ждать не смог :) что-то с менеджером кучи?


 
MTsv DN   (2008-10-06 09:10) [10]

> что-то с менеджером кучи?
Заменой системных модулей пользуетесь?


 
Rocket ©   (2008-10-06 09:17) [11]

точно. забыл проверить, спасибо за напоминание :)
без замены всё ок.
а как быть, если всё же хочется воспользоваться заменой ради экономии размера?


 
MTsv DN   (2008-10-06 10:06) [12]

> а как быть, если всё же хочется воспользоваться заменой ради экономии размера?
Я для себя отказался от замены. Сталкивался с случаями когда это "боком вылазило". 5-7кБ упакованного кода для меня не так принципиальны...


 
exero   (2008-10-06 10:08) [13]

Экономия ради экономии? или все-таки есть более-менее внятное объяснение?


 
exero   (2008-10-06 10:14) [14]

В свое время когда баловался я этими модулями - как результат - программа урод - мелкая но тормознутая до ужаса. О пользователях думать надо - а то стремно как-то стоит у человека топовая машина, а производительности то нет (.


 
MTsv DN   (2008-10-06 10:21) [15]

2 Rocket
Кстати, а Вы без замены и фикса протестируйте, плиз...


 
MTsv DN   (2008-10-06 10:46) [16]

Сам проверил. Без фикса от vampir_infernal утечка присутствует...и после завершения приложения.


 
vampir_infernal   (2008-10-06 12:49) [17]

плюс, при включенной отрисовке в XP-стиле так же происходят утечки из-за того, что результат функции GetWindowDC должен быть освобожден с помощью ReleaseDC:
файл visual_xp_styles.inc, функция WndXPMessage. Во всей функции строки вида
Sender.OnPaint(Sender, GetWindowDC(Msg.hWnd));
нужно исправить по принципу
var dDC : HDC;
-----
  dDC := GetWindowDC(Msg.hWnd);
  Sender.OnPaint(Sender, dDC);
  ReleaseDC( Msg.hWnd, dDC );
-----

Аналогичная ситуация с вызовами LoadIcon, продолжаю разбираться



Страницы: 1 вся ветка

Текущий архив: 2010.09.19;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.011 c
15-1275517571
RGV
2010-06-03 02:26
2010.09.19
Простенький Video stream сервер


15-1277238595
Юрий
2010-06-23 00:29
2010.09.19
С днем рождения ! 23 июня 2010 среда


15-1277470736
12
2010-06-25 16:58
2010.09.19
Киньтесь ссылкой на архив иконок


15-1277560566
Typer
2010-06-26 17:56
2010.09.19
Как выделить все ветки созданные одним автором??


15-1276586599
brother
2010-06-15 11:23
2010.09.19
Электронные сигареты