Конференция "KOL" » Утечка памяти при динамическом создании форм и UNICODE_CTRLS [Delphi, 7, Windows]
 
  • Rocket © (02.10.08 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 (04.10.08 10:46) [1]
    Привет...

    Проверьте свой код. Все нормально. Только что проверил и при включенной и при выключенной директиве unicode_ctrls. Разницы нет, все освобождается нормально. Было 2.868кБ - Нажатие на кнопку - Выполнение Вашего цикла - стало 2.872кБ.
  • Vladimir Kladov © (04.10.08 12:14) [2]
    Диспетчер задач показывает в том числе и память, которая не вернулась от приложения, даже если в данный момент она корректно освобождена и осталась в распоряжении менеджера кучи. Смотреть надо мемпруфом, fastMMx или другими анализаторами утечек.
  • Rocket © (04.10.08 13:33) [3]
    MTsv DN,
    да, 4 килобайта за один цикл в среднем.
    Владимир Кладов,
    да, я понимаю, что это не самый лучший анализатор, сейчас проверю мемпруфом.
  • Rocket © (04.10.08 13:52) [4]
    memproof 0.9.5.0 показывает рост потребляемых ресурсов в области OLE - SysString. дедукция подсказывает, что это связано со строками :)
    без ключа UNICODE_CTRLS роста не наблюдается.
  • Vladimir Kladov © (04.10.08 18:02) [5]
    и по окончании программы они оказываются не освобождены?
  • Rocket © (04.10.08 18:18) [6]
    да, судя по мемпруфу
  • vampir_infernal (05.10.08 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 (05.10.08 11:19) [8]
    {$IFDEF UNICODE_CTRLS}
    var tempolestr : PWideChar;
    {$ENDIF}


    fixed
  • Rocket © (06.10.08 08:54) [9]
    vampir_infernal,
    спасибо, мемпруф теперь доволен. этот фикс надо в тему про 2.88.
    но диспетчер задач всё-таки показывает увеличение выделенной памяти. поставил в цикл миллион, выделенная память дошла до 100 мегабайт, дальше ждать не смог :) что-то с менеджером кучи?
  • MTsv DN (06.10.08 09:10) [10]
    > что-то с менеджером кучи?
    Заменой системных модулей пользуетесь?
  • Rocket © (06.10.08 09:17) [11]
    точно. забыл проверить, спасибо за напоминание :)
    без замены всё ок.
    а как быть, если всё же хочется воспользоваться заменой ради экономии размера?
  • MTsv DN (06.10.08 10:06) [12]
    > а как быть, если всё же хочется воспользоваться заменой ради экономии размера?
    Я для себя отказался от замены. Сталкивался с случаями когда это "боком вылазило". 5-7кБ упакованного кода для меня не так принципиальны...
  • exero (06.10.08 10:08) [13]
    Экономия ради экономии? или все-таки есть более-менее внятное объяснение?
  • exero (06.10.08 10:14) [14]
    В свое время когда баловался я этими модулями - как результат - программа урод - мелкая но тормознутая до ужаса. О пользователях думать надо - а то стремно как-то стоит у человека топовая машина, а производительности то нет (.
  • MTsv DN (06.10.08 10:21) [15]
    2 Rocket
    Кстати, а Вы без замены и фикса протестируйте, плиз...
  • MTsv DN (06.10.08 10:46) [16]
    Сам проверил. Без фикса от vampir_infernal утечка присутствует...и после завершения приложения.
  • vampir_infernal (06.10.08 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, продолжаю разбираться
 
Конференция "KOL" » Утечка памяти при динамическом создании форм и UNICODE_CTRLS [Delphi, 7, Windows]
Есть новые Нет новых   [134432   +18][b:0][p:0.001]