Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Удаление TArray вызывает ошибку, почему? / 25 сообщений из 46, страница 1 из 2
15.03.2020, 08:47
    #39937508
antox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление TArray вызывает ошибку, почему?
Есть запись

Код: pascal
1.
2.
3.
4.
  rVariables= record
    varNam: string;
    varVal: Variant;
  end;



Делаю массив записей

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
var
  varr: TArray<rVariables>; //Список переменных
  rv: rVariables;
begin
  rv.varNam:='one';
  rv.varVal:='oneValue';

  varr := TArray<rVariables>.Create(rv); //Это вообще законно?

  FreeAndNil(varr); //access violation



Почему так происходит и если это нормально, то как тогда освобождать память?
...
Рейтинг: 0 / 0
15.03.2020, 08:58
    #39937510
Sinemurius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление TArray вызывает ошибку, почему?
TArray - это не класс. Освобождать не нужно. Полностью аналогично строке
...
Рейтинг: 0 / 0
15.03.2020, 09:03
    #39937512
antox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление TArray вызывает ошибку, почему?
Sinemurius
TArray - это не класс. Освобождать не нужно. Полностью аналогично строке


т.е.

Код: pascal
1.
SetLength(varr, 0); 



будет достаточно? и при этом все rv: rVariables;, которые вошли в массив также будут уничтожены?
...
Рейтинг: 0 / 0
15.03.2020, 10:50
    #39937520
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление TArray вызывает ошибку, почему?
antox,

Если массив содержит записи, которые содержат управляемые типы, то можно вообще ничего не делать... Как только переменная выйдет за область видимости, память освободится
...
Рейтинг: 0 / 0
15.03.2020, 10:52
    #39937521
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление TArray вызывает ошибку, почему?
Код: pascal
1.
varr := TArray<rVariables>.Create(rv); //Это вообще законно?



Законно, это не конструктор, это синтаксический сахар...


Код: pascal
1.
varr := TArray<rVariables>.Create(rv, rv, rv, rv);



аналогично
Код: pascal
1.
2.
3.
4.
5.
SetLength(varr, 4);
varr[0] := rv;
varr[1] := rv;
varr[2] := rv;
varr[3] := rv;
...
Рейтинг: 0 / 0
15.03.2020, 11:25
    #39937524
antox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление TArray вызывает ошибку, почему?
Классно! Спасибо
...
Рейтинг: 0 / 0
16.03.2020, 10:34
    #39937746
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление TArray вызывает ошибку, почему?
X-Cite
Законно, это не конструктор, это синтаксический сахар...

Только запутывает, имхо. Зря они его под конструктор сделали.
...
Рейтинг: 0 / 0
16.03.2020, 13:36
    #39937807
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление TArray вызывает ошибку, почему?
Василий 2,

Не нравиться, не пользуйся.

Можешь сделать так: varr := [rv, rv, rv, rv];
...
Рейтинг: 0 / 0
16.03.2020, 15:51
    #39937873
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление TArray вызывает ошибку, почему?
Василий 2
Только запутывает, имхо. Зря они его под конструктор сделали.
Ага. Когда самому нужно что-то подобное, то пишу так
Код: pascal
1.
2.
3.
4.
class function TMyRec.Init(...): TMyRec;
begin
   ........
end;

И тогда если в коде вижу
Код: pascal
1.
LVar := TMyRec.Init(...)

сразу понимаю, что никакого Free не нужно
...
Рейтинг: 0 / 0
16.03.2020, 15:52
    #39937874
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление TArray вызывает ошибку, почему?
rgreat
Не нравиться, не пользуйся.
Именно по этому не пользуюсь ни одним record-конструктором. Чтобы не путаться
...
Рейтинг: 0 / 0
16.03.2020, 15:54
    #39937875
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление TArray вызывает ошибку, почему?
Реализация через конструктор полезна в режиме инлайн переменных.

Достаточно одной строчки и для создания и для инициализации.

Код: pascal
1.
var arr:=TArray<rVariables>.Create(rv,rv,rv,rv);
...
Рейтинг: 0 / 0
16.03.2020, 15:56
    #39937877
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление TArray вызывает ошибку, почему?
_Vasilisk_
Именно по этому не пользуюсь ни одним record-конструктором. Чтобы не путаться
Было бы чего там путать.
Скоро разницы между классом и рекордом в этом плане уже не будет.
...
Рейтинг: 0 / 0
16.03.2020, 16:13
    #39937889
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление TArray вызывает ошибку, почему?
rgreat
Реализация через конструктор полезна в режиме инлайн переменных.
Я не спорю. Но когда я вижу конструкцию
Код: pascal
1.
LVar := TType.Create;

или
Код: pascal
1.
constructor TType.Create;

я считаю, что идет работа с классом.

Функция
_Vasilisk_
Код: pascal
1.
class function TMyRec.Init(...): TMyRec;

абсолютно ничего не меняет в плане использования, но сразу показывает, что это не класс
rgreat
Скоро разницы между классом и рекордом в этом плане уже не будет.
Когда они придумают рекорд-деструктор вот тогда и не будет. Но тогда получится у них обычный object
...
Рейтинг: 0 / 0
16.03.2020, 16:22
    #39937894
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление TArray вызывает ошибку, почему?
_Vasilisk_
Когда они придумают рекорд-деструктор вот тогда и не будет. Но тогда получится у них обычный object
Ну почти. VMT то у рекорда все еще нет, как впрочем и наследования.
...
Рейтинг: 0 / 0
16.03.2020, 16:36
    #39937906
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление TArray вызывает ошибку, почему?
_Vasilisk_
rgreat
Не нравиться, не пользуйся.
Именно по этому не пользуюсь ни одним record-конструктором. Чтобы не путаться


Если следовать стилистике, то когда видишь TArray<T>.Create - то это всегда массив...
...
Рейтинг: 0 / 0
16.03.2020, 18:23
    #39937962
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление TArray вызывает ошибку, почему?
X-Cite
Если следовать стилистике, то когда видишь TArray<T>.Create - то это всегда массив...
Допустим. А если
Код: pascal
1.
LVar := TFormatSettings.Create

? А если
Код: pascal
1.
LVar := TMyType.Create

?

Вот поэтому, чтобы каждый раз не вспоминать, что это за тип - простое правило: Create только для классов
...
Рейтинг: 0 / 0
16.03.2020, 18:58
    #39937979
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление TArray вызывает ошибку, почему?
_Vasilisk_,

Если у тебя есть проблемы с запоминанием что есть что в типах, добавляй префиксы/постфиксы.

Типа TMyTypeArray.
...
Рейтинг: 0 / 0
16.03.2020, 19:10
    #39937983
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление TArray вызывает ошибку, почему?
rgreat
добавляй префиксы/постфиксы.
Замечательно! Как быть с уже объявленными типами в RTL/VCL?

Зачем что-то запоминать, если можно просто не делать опасных вещей? Знаешь историю про
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure TForm1.Button1Click(Sender: TObject);
var
  LR: TRect;
begin
  with LR do
    Left := Width;
  ........
end;

?
...
Рейтинг: 0 / 0
16.03.2020, 19:33
    #39937993
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление TArray вызывает ошибку, почему?
_Vasilisk_
Зачем что-то запоминать, если можно просто не делать опасных вещей?
ИМХО проблема надуманная.
У меня никогда не было проблем с тем что бы я путал класс, массив и рекорд.
Если я точно не помню - смотрю определение типа.
Знаешь историю про
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure TForm1.Button1Click(Sender: TObject);
var
  LR: TRect;
begin
  with LR do
    Left := Width;
  ........
end;

?With - старая боль совсем другого типа.
И имхо там оснавная проблема даже не в том что оно изначально может быть криво написано из-за, а в том что при переопределении атрибутов и свойств типа может незаметно поменяться работа ПО в произвольном месте кода.
...
Рейтинг: 0 / 0
16.03.2020, 19:45
    #39937997
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление TArray вызывает ошибку, почему?
..
...
Рейтинг: 0 / 0
17.03.2020, 10:46
    #39938129
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление TArray вызывает ошибку, почему?
rgreat

У меня никогда не было проблем с тем что бы я путал класс, массив и рекорд.
Если я точно не помню - смотрю определение типа.

В данной дискуссии ты судишь исключительно по себе. А мой и Василиска поинт в том, что такая конструкция запутывает. Пускай не профи с 20-летним стажем, а неофитов. Но все же. Зачем делать ловушку на ровном месте? Тем более в языке с ручным управлением памятью, где нужно понимать, чем отличается объект от структуры.
...
Рейтинг: 0 / 0
17.03.2020, 11:02
    #39938137
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление TArray вызывает ошибку, почему?
Василий 2,

Ты сейчас договоришься до того, что используемый инструмент нужно знать и уметь. Офигеть же требования, правда?
...
Рейтинг: 0 / 0
17.03.2020, 11:08
    #39938143
zedxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление TArray вызывает ошибку, почему?
В новой версии Delphi нас ждут Managed Records с конструкторами, конструкторами копирования и деструкторами (которые будут вызываться автоматически), так что будет ещё веселее: https://blog.marcocantu.com/blog/2018-november-custom-managed-records-delphi.html

Код: pascal
1.
2.
3.
4.
5.
6.
7.
type
  TMyRecord = record
    Value: Integer;
    constructor Create; overload;
    constructor Create (const mr: TMyRecord); overload;
    destructor Destroy;
  end;
...
Рейтинг: 0 / 0
17.03.2020, 11:12
    #39938145
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление TArray вызывает ошибку, почему?
zedxxx,

Это, кстати, обещали сделать ещё в Delphi 2009. С тех пор ждём.
...
Рейтинг: 0 / 0
17.03.2020, 11:15
    #39938147
zedxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление TArray вызывает ошибку, почему?
В 10.4 уже вроде как точно будет. Осталось месяц-другой подождать.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Удаление TArray вызывает ошибку, почему? / 25 сообщений из 46, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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