Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Custom Managed Records утечка памяти строк / 9 сообщений из 9, страница 1 из 1
27.11.2020, 11:39
    #40022692
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Custom Managed Records утечка памяти строк
Добрый день. пример приложил... Текут строки.. Что-то я не учел, или оформлять баг?

Код: 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.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
unit Classes;

interface

type
  TRecord<T> = record
    class operator Initialize(out aValue: TRecord<T>);
    class operator Implicit(aValue: T): TRecord<T>;
  private
    FValue: T;
  public
    constructor Create(const aValue: T);

    property Value: T read FValue;
  end;

  TRecordCollection<T: record> = record
    class operator Initialize(out aValue: TRecordCollection<T>);
  private
    FItems: TArray<T>;
  public
    constructor Create(const aItems: TArray<T>); overload;
    function First: TRecord<T>;
  end;

  TTest1 = record
    ID: Int32;
  end;

  TTest2 = record
    ID: Int32;
    Name: string;
    Description: string;
    Test: TTest1;
  end;

implementation

{ TRecord<T> }

class operator TRecord<T>.Initialize(out aValue: TRecord<T>);
begin
  aValue.FValue := Default(T);
end;

class operator TRecord<T>.Implicit(aValue: T): TRecord<T>;
begin
  Exit(TRecord<T>.Create(aValue));
end;

constructor TRecord<T>.Create(const aValue: T);
begin
  FValue := aValue;
end;

{ TRecordCollection<T> }

constructor TRecordCollection<T>.Create(const aItems: TArray<T>);
begin
  FItems := aItems;
end;

function TRecordCollection<T>.First: TRecord<T>;
begin
  Exit(FItems[0]);
end;

class operator TRecordCollection<T>.Initialize(out aValue: TRecordCollection<T>);
begin
  aValue.FItems := Default(TArray<T>);
end;

end.



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
procedure TForm1.Button1Click(Sender: TObject);
var
  Data: TArray<TTest2>;
  RC: TRecordCollection<TTest2>;
  R: TRecord<TTest2>;
  V: TTest2;
begin
  ReportMemoryLeaksOnShutdown := True;
  SetLength(Data, 2);
  Data[0].ID := 1;
  Data[0].Name := 'Name';
  Data[0].Description := 'Description';
  Data[0].Test.ID := 10;
  Data[1].ID := 2;
  Data[1].Name := 'Name';
  Data[1].Description := 'Description';
  Data[1].Test.ID := 20;
  RC := TRecordCollection<TTest2>.Create(Data);
  R := Rc.First();
  V := R.Value;
end;




21 - 28 bytes: UnicodeString x 1
29 - 36 bytes: UnicodeString x 1
...
Рейтинг: 0 / 0
27.11.2020, 11:44
    #40022695
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Custom Managed Records утечка памяти строк
может надо сделать
Код: pascal
1.
SetLength(Data, 0);


в конце ?
...
Рейтинг: 0 / 0
27.11.2020, 11:45
    #40022696
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Custom Managed Records утечка памяти строк
X-Cite
Код: pascal
1.
RC := TRecordCollection<TTest2>.Create(Data);



а освобождать не надо?
...
Рейтинг: 0 / 0
27.11.2020, 11:52
    #40022702
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Custom Managed Records утечка памяти строк
Само должно это же массив.

Еще всплыла проблема с инлайн переменными... Если метод First написать так, то будет ошибка

Код: pascal
1.
2.
3.
4.
5.
function TRecordCollection<T>.First: TRecord<T>;
begin
  var X := FItems[0];
  Exit(TRecord<T>.Create(X));
end;



Компилятор не очищает X при входе в метод, и там лежит мусор, при присвоении пытается чистить строки и естественно падает

А если так, то нет, X уже почищена.
Код: pascal
1.
2.
3.
4.
5.
6.
function TRecordCollection<T>.First: TRecord<T>;
var X: T;
begin
  X := FItems[0];
  Exit(TRecord<T>.Create(X));
end;
...
Рейтинг: 0 / 0
27.11.2020, 11:54
    #40022704
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Custom Managed Records утечка памяти строк
а освобождать не надо?

Это запись, сама освободится..

В коде только управляемые переменные, все должно само управляться....
...
Рейтинг: 0 / 0
27.11.2020, 11:59
    #40022710
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Custom Managed Records утечка памяти строк
Если First переписать так (через Result, а не Exit с конструктором), то утечки нет

Код: pascal
1.
2.
3.
4.
function TRecordCollection<T>.First: TRecord<T>;
begin
  Result.FValue := FItems[0];
end;
...
Рейтинг: 0 / 0
27.11.2020, 12:02
    #40022714
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Custom Managed Records утечка памяти строк
X-Cite,

Репорти, проголосуем.
...
Рейтинг: 0 / 0
27.11.2020, 12:08
    #40022721
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Custom Managed Records утечка памяти строк
попробуй принудительно
...
Рейтинг: 0 / 0
27.11.2020, 12:24
    #40022730
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Custom Managed Records утечка памяти строк
https://quality.embarcadero.com/browse/RSP-31751 - Управляемые записи
https://quality.embarcadero.com/browse/RSP-31752 - Инлайн переменные
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Custom Managed Records утечка памяти строк / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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