Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
15-1277096188
tipman
2010-06-21 08:56
2010.09.19
Выпадающая таблица или таблица в ComboBox


8-1205857317
siv
2008-03-18 19:21
2010.09.19
Всем привет! Люди, помогите пропикать системному спикеру из Delph


15-1277274873
pasha_golub
2010-06-23 10:34
2010.09.19
PHP: когда закрывать соединение с базой


2-1277272307
Cannon
2010-06-23 09:51
2010.09.19
Converter DBF to MDB


15-1277435535
MonoLife
2010-06-25 07:12
2010.09.19
Ищу песню.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский