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

Код: 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
Custom Managed Records утечка памяти строк
    #40022695
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может надо сделать
Код: pascal
1.
SetLength(Data, 0);


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



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

Еще всплыла проблема с инлайн переменными... Если метод 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
Custom Managed Records утечка памяти строк
    #40022704
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а освобождать не надо?

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

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

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

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


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