-
По нажатию кнопки на главной форме: for i := 0 to 100 do
begin
NewForm5(Form5, Applet);
Form5.Form.Free;
end; Диспетчер задач показывает, что память при Free не освобождается. Количество отъедаеммой памяти сильно зависит от количества контролов. Без ключа UNICODE_CTRLS всё, вроде бы, нормально. KOL+MCK 2.88
-
Привет...
Проверьте свой код. Все нормально. Только что проверил и при включенной и при выключенной директиве unicode_ctrls. Разницы нет, все освобождается нормально. Было 2.868кБ - Нажатие на кнопку - Выполнение Вашего цикла - стало 2.872кБ.
-
Диспетчер задач показывает в том числе и память, которая не вернулась от приложения, даже если в данный момент она корректно освобождена и осталась в распоряжении менеджера кучи. Смотреть надо мемпруфом, fastMMx или другими анализаторами утечек.
-
MTsv DN, да, 4 килобайта за один цикл в среднем. Владимир Кладов, да, я понимаю, что это не самый лучший анализатор, сейчас проверю мемпруфом.
-
memproof 0.9.5.0 показывает рост потребляемых ресурсов в области OLE - SysString. дедукция подсказывает, что это связано со строками :) без ключа UNICODE_CTRLS роста не наблюдается.
-
и по окончании программы они оказываются не освобождены?
-
да, судя по мемпруфу
-
KOL.PAS 2.88 строка 33800, функция TControl.CreateWindow.
StrCopy( Params.WinClsNamBuf, @ SubClassName[ 1 ] );
lstrcpyW(Params.WinClsNamBuf,StringToOleStr(SubClassName));
Мемпруф видит, что не освобождается результат функции SysAllocStringLen, которая вызывается внутри StringToOleStr, и согласно справке, должен быть освобожден с помощью SysFreeString. Попробуйте так:
var tempolestr : PWideChar;
begin
------
StrCopy( Params.WinClsNamBuf, @ SubClassName[ 1 ] );
tempolestr := StringToOleStr(SubClassName);
lstrcpyW(Params.WinClsNamBuf, tempolestr);
SysFreeString( tempolestr );
------
end;
-
var tempolestr : PWideChar;
fixed
-
vampir_infernal, спасибо, мемпруф теперь доволен. этот фикс надо в тему про 2.88. но диспетчер задач всё-таки показывает увеличение выделенной памяти. поставил в цикл миллион, выделенная память дошла до 100 мегабайт, дальше ждать не смог :) что-то с менеджером кучи?
-
> что-то с менеджером кучи? Заменой системных модулей пользуетесь?
-
точно. забыл проверить, спасибо за напоминание :) без замены всё ок. а как быть, если всё же хочется воспользоваться заменой ради экономии размера?
-
> а как быть, если всё же хочется воспользоваться заменой ради экономии размера? Я для себя отказался от замены. Сталкивался с случаями когда это "боком вылазило". 5-7кБ упакованного кода для меня не так принципиальны...
-
Экономия ради экономии? или все-таки есть более-менее внятное объяснение?
-
В свое время когда баловался я этими модулями - как результат - программа урод - мелкая но тормознутая до ужаса. О пользователях думать надо - а то стремно как-то стоит у человека топовая машина, а производительности то нет (.
-
2 Rocket Кстати, а Вы без замены и фикса протестируйте, плиз...
-
Сам проверил. Без фикса от vampir_infernal утечка присутствует...и после завершения приложения.
-
плюс, при включенной отрисовке в 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, продолжаю разбираться
|