Форум: "KOL";
Текущий архив: 2010.09.19;
Скачать: [xml.tar.bz2];
ВнизУтечка памяти при динамическом создании форм и 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 вся ветка
Форум: "KOL";
Текущий архив: 2010.09.19;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.004 c