powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Помогите найти утечку памяти
12 сообщений из 12, страница 1 из 1
Помогите найти утечку памяти
    #39502826
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

Где в этом коде
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Generics.Collections,
  Generics.Defaults;

var
  FComparer: TDelegatedComparer<String>;

begin
  ReportMemoryLeaksOnShutdown := True;
  try

    FComparer := TDelegatedComparer<String>.Create(
      function(const Left, Right: String): Integer
        function __GetSubName(const AFileName: String): String;
        var
          APos: Integer;
        begin
          Result := ExtractFileName(AFileName);
          APos := Pos('_', Result);
          if APos > 0 then
            Delete(Result, 1, APos);
          if Result = '' then
            Result := ExtractFileName(AFileName);
        end;
      begin
        Result := AnsiCompareText(__GetSubName(Left), __GetSubName(Right));
      end
    );
    try
      //TArray.Sort<String>(FFiles, FComparer);
    finally
      FreeAndNil(FComparer);
    end; // *)
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

утечка памяти?

Код: pascal
1.
2.
3.
An unexpected memory leak has occurred. The unexpected small block leaks are:

13 - 20 bytes: Project2$392$ActRec x 1
...
Рейтинг: 0 / 0
Помогите найти утечку памяти
    #39502830
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__,
Сдаётся мне, что это анонимный метод сам по себе.
...
Рейтинг: 0 / 0
Помогите найти утечку памяти
    #39502834
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Delphi 10.2 - утечки нет.
...
Рейтинг: 0 / 0
Помогите найти утечку памяти
    #39502860
Dunkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если перенести код в отдельный unit, то утечки не будет.
В QC были репорты типа, если объявить string в dpr, то происходит утечка и ещё похожие (для какой версии не помню).
...
Рейтинг: 0 / 0
Помогите найти утечку памяти
    #39502956
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то написано очень криво. Не так это используется. Ознакомьтесь с матчастью
...
Рейтинг: 0 / 0
Помогите найти утечку памяти
    #39502957
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно замыкание инициализировать в отдельную переменную
Для надёжности вручную прибить
...
Рейтинг: 0 / 0
Помогите найти утечку памяти
    #39502987
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUНужно замыкание инициализировать в отдельную переменную
Для надёжности вручную прибитьБред. Не нужно ничего прибивать в принципе. При правильном подходе всё само прибивается. ТС-у рекомендую глянуть это . Там внизу примеры разных корректных реализаций компареров
...
Рейтинг: 0 / 0
Помогите найти утечку памяти
    #39503370
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerВообще-то написано очень криво. Не так это используется. Ознакомьтесь с матчастью

Если Вы на IComparer<String>, то там тоже утечка.

Всем спасибо. Завернул код в процедуру утечка исчезла.
...
Рейтинг: 0 / 0
Помогите найти утечку памяти
    #39503394
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__Если Вы на IComparer<String>, то там тоже утечка.
Всем спасибо. Завернул код в процедуру утечка исчезла.У меня нет утечек. Компареры у нас используются активно. Правда был баг в самой делфе, кажется в XE2 - там был пропущен класс-деструктор у компарера в Generics.Defaults. Вот там был лик, который позже пофиксили
...
Рейтинг: 0 / 0
Помогите найти утечку памяти
    #39503480
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы не было утечек нужно правильно делать так

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Generics.Collections,
  Generics.Defaults;

procedure Test;
var FComparer: IComparer<String>;
begin
  FComparer := TDelegatedComparer<String>.Create(
    function(const Left, Right: String): Integer
      function __GetSubName(const AFileName: String): String;
      var
        APos: Integer;
      begin
        Result := ExtractFileName(AFileName);
        APos := Pos('_', Result);
        if APos > 0 then
          Delete(Result, 1, APos);
        if Result = '' then
          Result := ExtractFileName(AFileName);
      end;
    begin
      Result := AnsiCompareText(__GetSubName(Left), __GetSubName(Right));
    end
  );
end;

begin
  ReportMemoryLeaksOnShutdown := True;
  try
    Test;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.



Чтобы не было утечек нужно:
1. Указать FComparer как интерфейс IComparer<String>. Тогда будет автоматическая очистка памяти.
2. Вложить в код в процедуру, т. к. в главном приложении интерфейсы не очищаются, т. к. всегда
остается указатель на интерфейс в глобальной переменной. Лучше в глобальных переменных не использовать интерфейсы (не почистятся) в основной программе.
...
Рейтинг: 0 / 0
Помогите найти утечку памяти
    #39503549
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerSOFT FOR YOUНужно замыкание инициализировать в отдельную переменную
Для надёжности вручную прибитьБред. Не нужно ничего прибивать в принципе. При правильном подходе всё само прибивается. ТС-у рекомендую глянуть это . Там внизу примеры разных корректных реализаций компареров

Судя по отчёту течёт именно замыкание )
...
Рейтинг: 0 / 0
Помогите найти утечку памяти
    #39503564
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUСудя по отчёту течёт именно замыкание )
У автора не правильно реализован IComparer, поэтому и течет.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Помогите найти утечку памяти
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]