Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Удаление TArray вызывает ошибку, почему?  [new]
antox
Member

Откуда: РФ
Сообщений: 1097
Есть запись

  rVariables= record
    varNam: string;
    varVal: Variant;
  end;


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

var
  varr: TArray<rVariables>; //Список переменных
  rv: rVariables;
begin
  rv.varNam:='one';
  rv.varVal:='oneValue';

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

  FreeAndNil(varr); //access violation


Почему так происходит и если это нормально, то как тогда освобождать память?
15 мар 20, 08:47    [22099253]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
Sinemurius
Member

Откуда:
Сообщений: 133
TArray - это не класс. Освобождать не нужно. Полностью аналогично строке
15 мар 20, 08:58    [22099255]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
antox
Member

Откуда: РФ
Сообщений: 1097
Sinemurius
TArray - это не класс. Освобождать не нужно. Полностью аналогично строке


т.е.

SetLength(varr, 0); 


будет достаточно? и при этом все rv: rVariables;, которые вошли в массив также будут уничтожены?

Сообщение было отредактировано: 15 мар 20, 09:03
15 мар 20, 09:03    [22099257]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1668
antox,

Если массив содержит записи, которые содержат управляемые типы, то можно вообще ничего не делать... Как только переменная выйдет за область видимости, память освободится
15 мар 20, 10:50    [22099278]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1668
varr := TArray<rVariables>.Create(rv); //Это вообще законно?


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


varr := TArray<rVariables>.Create(rv, rv, rv, rv);


аналогично
SetLength(varr, 4);
varr[0] := rv;
varr[1] := rv;
varr[2] := rv;
varr[3] := rv;
15 мар 20, 10:52    [22099279]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
antox
Member

Откуда: РФ
Сообщений: 1097
Классно! Спасибо
15 мар 20, 11:25    [22099290]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
X-Cite
Законно, это не конструктор, это синтаксический сахар...

Только запутывает, имхо. Зря они его под конструктор сделали.
16 мар 20, 10:34    [22099670]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
rgreat
Member

Откуда:
Сообщений: 5722
Василий 2,

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

Можешь сделать так: varr := [rv, rv, rv, rv];
16 мар 20, 13:36    [22099855]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11602
Василий 2
Только запутывает, имхо. Зря они его под конструктор сделали.
Ага. Когда самому нужно что-то подобное, то пишу так
class function TMyRec.Init(...): TMyRec;
begin
   ........
end;
И тогда если в коде вижу
LVar := TMyRec.Init(...)
сразу понимаю, что никакого Free не нужно
16 мар 20, 15:51    [22099987]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11602
rgreat
Не нравиться, не пользуйся.
Именно по этому не пользуюсь ни одним record-конструктором. Чтобы не путаться
16 мар 20, 15:52    [22099990]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
rgreat
Member

Откуда:
Сообщений: 5722
Реализация через конструктор полезна в режиме инлайн переменных.

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

var arr:=TArray<rVariables>.Create(rv,rv,rv,rv);
16 мар 20, 15:54    [22099991]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
rgreat
Member

Откуда:
Сообщений: 5722
_Vasilisk_
Именно по этому не пользуюсь ни одним record-конструктором. Чтобы не путаться
Было бы чего там путать.
Скоро разницы между классом и рекордом в этом плане уже не будет.
16 мар 20, 15:56    [22099994]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11602
rgreat
Реализация через конструктор полезна в режиме инлайн переменных.
Я не спорю. Но когда я вижу конструкцию
LVar := TType.Create;
или
constructor TType.Create;
я считаю, что идет работа с классом.

Функция
_Vasilisk_
class function TMyRec.Init(...): TMyRec;
абсолютно ничего не меняет в плане использования, но сразу показывает, что это не класс
rgreat
Скоро разницы между классом и рекордом в этом плане уже не будет.
Когда они придумают рекорд-деструктор вот тогда и не будет. Но тогда получится у них обычный object
16 мар 20, 16:13    [22100011]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
rgreat
Member

Откуда:
Сообщений: 5722
_Vasilisk_
Когда они придумают рекорд-деструктор вот тогда и не будет. Но тогда получится у них обычный object
Ну почти. VMT то у рекорда все еще нет, как впрочем и наследования.
16 мар 20, 16:22    [22100018]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1668
_Vasilisk_
rgreat
Не нравиться, не пользуйся.
Именно по этому не пользуюсь ни одним record-конструктором. Чтобы не путаться


Если следовать стилистике, то когда видишь TArray<T>.Create - то это всегда массив...
16 мар 20, 16:36    [22100035]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11602
X-Cite
Если следовать стилистике, то когда видишь TArray<T>.Create - то это всегда массив...
Допустим. А если
LVar := TFormatSettings.Create
? А если
LVar := TMyType.Create
?

Вот поэтому, чтобы каждый раз не вспоминать, что это за тип - простое правило: Create только для классов
16 мар 20, 18:23    [22100121]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
rgreat
Member

Откуда:
Сообщений: 5722
_Vasilisk_,

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

Типа TMyTypeArray.
16 мар 20, 18:58    [22100152]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11602
rgreat
добавляй префиксы/постфиксы.
Замечательно! Как быть с уже объявленными типами в RTL/VCL?

Зачем что-то запоминать, если можно просто не делать опасных вещей? Знаешь историю про
procedure TForm1.Button1Click(Sender: TObject);
var
  LR: TRect;
begin
  with LR do
    Left := Width;
  ........
end;
?
16 мар 20, 19:10    [22100159]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
rgreat
Member

Откуда:
Сообщений: 5722
_Vasilisk_
Зачем что-то запоминать, если можно просто не делать опасных вещей?
ИМХО проблема надуманная.
У меня никогда не было проблем с тем что бы я путал класс, массив и рекорд.
Если я точно не помню - смотрю определение типа.
Знаешь историю про
procedure TForm1.Button1Click(Sender: TObject);
var
  LR: TRect;
begin
  with LR do
    Left := Width;
  ........
end;
?
With - старая боль совсем другого типа.
И имхо там оснавная проблема даже не в том что оно изначально может быть криво написано из-за, а в том что при переопределении атрибутов и свойств типа может незаметно поменяться работа ПО в произвольном месте кода.
16 мар 20, 19:33    [22100172]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
rgreat
Member

Откуда:
Сообщений: 5722
..

Сообщение было отредактировано: 16 мар 20, 19:44
16 мар 20, 19:45    [22100178]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
rgreat

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

В данной дискуссии ты судишь исключительно по себе. А мой и Василиска поинт в том, что такая конструкция запутывает. Пускай не профи с 20-летним стажем, а неофитов. Но все же. Зачем делать ловушку на ровном месте? Тем более в языке с ручным управлением памятью, где нужно понимать, чем отличается объект от структуры.
17 мар 20, 10:46    [22100423]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4217
Василий 2,

Ты сейчас договоришься до того, что используемый инструмент нужно знать и уметь. Офигеть же требования, правда?
17 мар 20, 11:02    [22100439]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
zedxxx
Member

Откуда:
Сообщений: 5
В новой версии Delphi нас ждут Managed Records с конструкторами, конструкторами копирования и деструкторами (которые будут вызываться автоматически), так что будет ещё веселее: https://blog.marcocantu.com/blog/2018-november-custom-managed-records-delphi.html

type
  TMyRecord = record
    Value: Integer;
    constructor Create; overload;
    constructor Create (const mr: TMyRecord); overload;
    destructor Destroy;
  end;
17 мар 20, 11:08    [22100445]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4217
zedxxx,

Это, кстати, обещали сделать ещё в Delphi 2009. С тех пор ждём.

Сообщение было отредактировано: 17 мар 20, 11:12
17 мар 20, 11:12    [22100448]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
zedxxx
Member

Откуда:
Сообщений: 5
В 10.4 уже вроде как точно будет. Осталось месяц-другой подождать.
17 мар 20, 11:15    [22100452]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить