Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Помогите найти утечку памяти / 12 сообщений из 12, страница 1 из 1
09.08.2017, 17:46:50
    #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
09.08.2017, 17:49:18
    #39502830
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите найти утечку памяти
__Avenger__,
Сдаётся мне, что это анонимный метод сам по себе.
...
Рейтинг: 0 / 0
09.08.2017, 17:52:21
    #39502834
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите найти утечку памяти
Delphi 10.2 - утечки нет.
...
Рейтинг: 0 / 0
09.08.2017, 18:18:06
    #39502860
Dunkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите найти утечку памяти
Если перенести код в отдельный unit, то утечки не будет.
В QC были репорты типа, если объявить string в dpr, то происходит утечка и ещё похожие (для какой версии не помню).
...
Рейтинг: 0 / 0
09.08.2017, 22:04:08
    #39502956
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите найти утечку памяти
Вообще-то написано очень криво. Не так это используется. Ознакомьтесь с матчастью
...
Рейтинг: 0 / 0
09.08.2017, 22:13:11
    #39502957
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите найти утечку памяти
Нужно замыкание инициализировать в отдельную переменную
Для надёжности вручную прибить
...
Рейтинг: 0 / 0
09.08.2017, 23:28:59
    #39502987
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите найти утечку памяти
SOFT FOR YOUНужно замыкание инициализировать в отдельную переменную
Для надёжности вручную прибитьБред. Не нужно ничего прибивать в принципе. При правильном подходе всё само прибивается. ТС-у рекомендую глянуть это . Там внизу примеры разных корректных реализаций компареров
...
Рейтинг: 0 / 0
10.08.2017, 14:06:45
    #39503370
__Avenger__
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите найти утечку памяти
white_niggerВообще-то написано очень криво. Не так это используется. Ознакомьтесь с матчастью

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

Всем спасибо. Завернул код в процедуру утечка исчезла.
...
Рейтинг: 0 / 0
10.08.2017, 14:31:55
    #39503394
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите найти утечку памяти
__Avenger__Если Вы на IComparer<String>, то там тоже утечка.
Всем спасибо. Завернул код в процедуру утечка исчезла.У меня нет утечек. Компареры у нас используются активно. Правда был баг в самой делфе, кажется в XE2 - там был пропущен класс-деструктор у компарера в Generics.Defaults. Вот там был лик, который позже пофиксили
...
Рейтинг: 0 / 0
10.08.2017, 15:39:42
    #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
10.08.2017, 16:23:43
    #39503549
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите найти утечку памяти
white_niggerSOFT FOR YOUНужно замыкание инициализировать в отдельную переменную
Для надёжности вручную прибитьБред. Не нужно ничего прибивать в принципе. При правильном подходе всё само прибивается. ТС-у рекомендую глянуть это . Там внизу примеры разных корректных реализаций компареров

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


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