powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Удаление TArray вызывает ошибку, почему?
46 сообщений из 46, показаны все 2 страниц
Удаление TArray вызывает ошибку, почему?
    #39937508
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть запись

Код: 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
Удаление TArray вызывает ошибку, почему?
    #39937510
Sinemurius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TArray - это не класс. Освобождать не нужно. Полностью аналогично строке
...
Рейтинг: 0 / 0
Удаление TArray вызывает ошибку, почему?
    #39937512
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sinemurius
TArray - это не класс. Освобождать не нужно. Полностью аналогично строке


т.е.

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



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

Если массив содержит записи, которые содержат управляемые типы, то можно вообще ничего не делать... Как только переменная выйдет за область видимости, память освободится
...
Рейтинг: 0 / 0
Удаление TArray вызывает ошибку, почему?
    #39937521
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Удаление TArray вызывает ошибку, почему?
    #39937524
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Классно! Спасибо
...
Рейтинг: 0 / 0
Удаление TArray вызывает ошибку, почему?
    #39937746
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite
Законно, это не конструктор, это синтаксический сахар...

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

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

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

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

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

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

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

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

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

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

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


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

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

?

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

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

Типа TMyTypeArray.
...
Рейтинг: 0 / 0
Удаление TArray вызывает ошибку, почему?
    #39937983
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Удаление TArray вызывает ошибку, почему?
    #39937993
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_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
Удаление TArray вызывает ошибку, почему?
    #39937997
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
..
...
Рейтинг: 0 / 0
Удаление TArray вызывает ошибку, почему?
    #39938129
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat

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

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

Ты сейчас договоришься до того, что используемый инструмент нужно знать и уметь. Офигеть же требования, правда?
...
Рейтинг: 0 / 0
Удаление TArray вызывает ошибку, почему?
    #39938143
zedxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В новой версии 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
Удаление TArray вызывает ошибку, почему?
    #39938145
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zedxxx,

Это, кстати, обещали сделать ещё в Delphi 2009. С тех пор ждём.
...
Рейтинг: 0 / 0
Удаление TArray вызывает ошибку, почему?
    #39938147
zedxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В 10.4 уже вроде как точно будет. Осталось месяц-другой подождать.
...
Рейтинг: 0 / 0
Удаление TArray вызывает ошибку, почему?
    #39938152
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zedxxx,

Да я верю. Не случилось в 10.3, случится в 10.4 :)
...
Рейтинг: 0 / 0
Удаление TArray вызывает ошибку, почему?
    #39938264
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
Ты сейчас договоришься до того, что используемый инструмент нужно знать и уметь. Офигеть же требования, правда?

Ой, ну вот давай не утрировать. Как будто очень весело на каждой строчке кода прыгать к объявлениям или ждать хинтов, чтобы выяснить, где какой тип.
...
Рейтинг: 0 / 0
Удаление TArray вызывает ошибку, почему?
    #39938276
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2
Как будто очень весело на каждой строчке кода прыгать к объявлениям или ждать хинтов, чтобы выяснить, где какой тип.

Вопрос в том, насколько часто ты не знаешь, где и какой тип. А также в том, для чего тебе это знать. У ТС путаница произошла не от незнания, а от того, что вместо вызова метода предназначенного для освобождения объекта, он пользуется костылём FreeAndNil.
...
Рейтинг: 0 / 0
Удаление TArray вызывает ошибку, почему?
    #39938306
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zedxxx
В новой версии 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;


Можно ожидать появления библиотек с упрощенным автоматическим управлением памятью. Вышел из scope -> зовется деструктор. Без старого фокуса с кривыми дельфийскими интерфейсами.
...
Рейтинг: 0 / 0
Удаление TArray вызывает ошибку, почему?
    #39938357
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
Вопрос в том, насколько часто ты не знаешь, где и какой тип. А также в том, для чего тебе это знать. У ТС путаница произошла не от незнания, а от того, что вместо вызова метода предназначенного для освобождения объекта, он пользуется костылём FreeAndNil.

В своем коде - знаю. В чужом - да как повезет. Для чего знать? А чтобы понимать, как его вообще применять.
А вот насчет FreeAndNil это ты очень зря.
...
Рейтинг: 0 / 0
Удаление TArray вызывает ошибку, почему?
    #39938364
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FreeAndNil для массива - это дурдом.

У меня по опыту даже Finalise(arr) иногда проблемы вызывал.
А вот Setlength(arr,0) работает надежно и предсказуемо.
...
Рейтинг: 0 / 0
Удаление TArray вызывает ошибку, почему?
    #39938369
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2
А чтобы понимать, как его вообще применять.

Чтобы понимать, как применять - читаешь доку, смотришь декларацию... и всё сразу видно. Никакой путаницы.

Василий 2
А вот насчет FreeAndNil это ты очень зря.

FreeAndNil не просто костыль, а опасный костыль. Что данный топик неиллюзорно символизирует.
...
Рейтинг: 0 / 0
Удаление TArray вызывает ошибку, почему?
    #39938372
zedxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreat
А вот Setlength(arr,0) работает надежно и предсказуемо.

Ещё можно писать:
Код: pascal
1.
arr := nil;


но ни это, ни SetLength особого смысла не несут, т.к. массив и так будет автоматически уничтожен при выходе из области видимости.
...
Рейтинг: 0 / 0
Удаление TArray вызывает ошибку, почему?
    #39938374
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zedxxx,

Понятное дело.

Да и Setlengh нужен только в момент обнуления перед повторным использованием массива.
...
Рейтинг: 0 / 0
Удаление TArray вызывает ошибку, почему?
    #39938375
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
У меня по опыту даже Finalise(arr) иногда проблемы вызывал.

Кровавые подробности? Так-то Finalize и SetLength(..., 0) сводятся к вызову одних и тех же процедур.
...
Рейтинг: 0 / 0
Удаление TArray вызывает ошибку, почему?
    #39938379
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
Кровавые подробности?
AV.
При смене на SetLength(x,0) проблема прошла.
Код был не мой, и разбираться было в лом.
Дело было минимум лет 10 назад. С тех пор Finalize я не пользую принципиально. Хотя и раньше не понимал его смысла в применении к массиву.
Так-то Finalize и SetLength(..., 0) сводятся к вызову одних и тех же процедур.А вот как-то так.
...
Рейтинг: 0 / 0
Удаление TArray вызывает ошибку, почему?
    #39938388
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если верить интернету , динамические массивы введены в обджект паскаль, чтобы народ не мучился с выделением памяти. Так нет, теперь им еще конструкторы/деструкторы подавай :)
...
Рейтинг: 0 / 0
Удаление TArray вызывает ошибку, почему?
    #39938537
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zedxxx

но ни это, ни SetLength особого смысла не несут, т.к. массив и так будет автоматически уничтожен при выходе из области видимости.

Ага, если вы объявляете в локальных переменных какой-нибудь управляемый тип, вроде string или array of ... , то это автоматически добавляет неявный try - finally. Это надо иметь в виду, когда пишите функции, которые планируете вызывать много раз в цикле.
...
Рейтинг: 0 / 0
Удаление TArray вызывает ошибку, почему?
    #39938557
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
FreeAndNil не просто костыль, а опасный костыль. Что данный топик неиллюзорно символизирует.

Что тут еще сказать... разве что вспомнить пословицу "Сдуру можно и х.. сломать"
...
Рейтинг: 0 / 0
Удаление TArray вызывает ошибку, почему?
    #39938560
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
FreeAndNil не просто костыль, а опасный костыль. Что данный топик неиллюзорно символизирует.

Ну да - "убивает пуля, а не человек".
...
Рейтинг: 0 / 0
Удаление TArray вызывает ошибку, почему?
    #39938563
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
если вы объявляете в локальных переменных какой-нибудь управляемый тип, вроде string или array of ... , то это автоматически добавляет неявный try - finally. Это надо иметь в виду, когда пишите функции, которые планируете вызывать много раз в цикле
да даже объявлять явных не надо, там неявных с аналогичными последствиями столько порой может нагенериться, что влияние в плотных циклах может оказаться весьма заметным
...
Рейтинг: 0 / 0
Удаление TArray вызывает ошибку, почему?
    #39938581
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
Ну да - "убивает пуля, а не человек".

Зри в корень.
...
Рейтинг: 0 / 0
Удаление TArray вызывает ошибку, почему?
    #39938595
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
FreeAndNil не просто костыль, а опасный костыль. Что данный топик неиллюзорно символизирует.

http://docwiki.embarcadero.com/Libraries/Rio/en/System.SysUtils.FreeAndNil
То, что FreeAndNil не ругается и позволяет использовать в качестве аргумента ссылку на массив записей (TArray<rVariables>), говорит о том, что среда считает её object reference. Наверное, это не совсем правильно, что среда позволяет такое писать:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure Foo;
var
  a: Integer;
begin
  a := 2;
  FreeAndNil(a);
end;
...
Рейтинг: 0 / 0
Удаление TArray вызывает ошибку, почему?
    #39938615
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45,

Какой, блин, обжект референс, когда там параметр нетипизированный
...
Рейтинг: 0 / 0
Удаление TArray вызывает ошибку, почему?
    #39938620
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Да, параметр нетипизирован. Но в процедуре тупо приводится к объекту.
...
Рейтинг: 0 / 0
Удаление TArray вызывает ошибку, почему?
    #39938639
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45
Да, параметр нетипизирован.

Вот поэтому на вход и можно подать всё что угодно, а вовсе не от того, что среда делает какие-то предположения.
...
Рейтинг: 0 / 0
46 сообщений из 46, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Удаление TArray вызывает ошибку, почему?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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