![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Утечка памяти при динамическом создании форм и UNICODE_CTRLS [Delphi, 7, Windows]
Rocket © (2008-10-02 22:39:00)По нажатию кнопки на главной форме:
for i := 0 to 100 do
begin
NewForm5(Form5, Applet);
Form5.Form.Free;
end;
Диспетчер задач показывает, что память при Free не освобождается.
Количество отъедаеммой памяти сильно зависит от количества контролов.
Без ключа UNICODE_CTRLS всё, вроде бы, нормально.
KOL+MCK 2.88
vampir_infernal (2008-10-06 12:49:00) [1]плюс, при включенной отрисовке в 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, продолжаю разбираться
MTsv DN (2008-10-06 10:46:00) [2]Сам проверил. Без фикса от vampir_infernal утечка присутствует...и после завершения приложения.
MTsv DN (2008-10-06 10:21:00) [3]2 Rocket
Кстати, а Вы без замены и фикса протестируйте, плиз...
exero (2008-10-06 10:14:00) [4]В свое время когда баловался я этими модулями - как результат - программа урод - мелкая но тормознутая до ужаса. О пользователях думать надо - а то стремно как-то стоит у человека топовая машина, а производительности то нет (.
exero (2008-10-06 10:08:00) [5]Экономия ради экономии? или все-таки есть более-менее внятное объяснение?
MTsv DN (2008-10-06 10:06:00) [6]> а как быть, если всё же хочется воспользоваться заменой ради экономии размера?
Я для себя отказался от замены. Сталкивался с случаями когда это "боком вылазило". 5-7кБ упакованного кода для меня не так принципиальны...
Rocket (2008-10-06 09:17:00) [7]точно. забыл проверить, спасибо за напоминание :)
без замены всё ок.
а как быть, если всё же хочется воспользоваться заменой ради экономии размера?
MTsv DN (2008-10-06 09:10:00) [8]> что-то с менеджером кучи?
Заменой системных модулей пользуетесь?
Rocket (2008-10-06 08:54:00) [9]vampir_infernal,
спасибо, мемпруф теперь доволен. этот фикс надо в тему про 2.88.
но диспетчер задач всё-таки показывает увеличение выделенной памяти. поставил в цикл миллион, выделенная память дошла до 100 мегабайт, дальше ждать не смог :) что-то с менеджером кучи?
vampir_infernal (2008-10-05 11:19:00) [10]
{$ IFDEFUNICODE_CTRLS}
var tempolestr : PWideChar;
{$ENDIF}
fixed
vampir_infernal (2008-10-05 09:33:00) [11]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;
Rocket (2008-10-04 18:18:00) [12]да, судя по мемпруфу
Vladimir Kladov (2008-10-04 18:02:00) [13]и по окончании программы они оказываются не освобождены?
Rocket (2008-10-04 13:52:00) [14]memproof 0.9.5.0 показывает рост потребляемых ресурсов в области OLE - SysString. дедукция подсказывает, что это связано со строками :)
без ключа UNICODE_CTRLS роста не наблюдается.
Rocket (2008-10-04 13:33:00) [15]MTsv DN,
да, 4 килобайта за один цикл в среднем.
Владимир Кладов,
да, я понимаю, что это не самый лучший анализатор, сейчас проверю мемпруфом.
Vladimir Kladov (2008-10-04 12:14:00) [16]Диспетчер задач показывает в том числе и память, которая не вернулась от приложения, даже если в данный момент она корректно освобождена и осталась в распоряжении менеджера кучи. Смотреть надо мемпруфом, fastMMx или другими анализаторами утечек.
MTsv DN (2008-10-04 10:46:00) [17]Привет...
Проверьте свой код. Все нормально. Только что проверил и при включенной и при выключенной директиве unicode_ctrls. Разницы нет, все освобождается нормально. Было 2.868кБ - Нажатие на кнопку - Выполнение Вашего цикла - стало 2.872кБ.