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

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

Да я верю. Не случилось в 10.3, случится в 10.4 :)
17 мар 20, 11:20    [22100461]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
Kazantsev Alexey
Ты сейчас договоришься до того, что используемый инструмент нужно знать и уметь. Офигеть же требования, правда?

Ой, ну вот давай не утрировать. Как будто очень весело на каждой строчке кода прыгать к объявлениям или ждать хинтов, чтобы выяснить, где какой тип.
17 мар 20, 14:16    [22100649]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4200
Василий 2
Как будто очень весело на каждой строчке кода прыгать к объявлениям или ждать хинтов, чтобы выяснить, где какой тип.

Вопрос в том, насколько часто ты не знаешь, где и какой тип. А также в том, для чего тебе это знать. У ТС путаница произошла не от незнания, а от того, что вместо вызова метода предназначенного для освобождения объекта, он пользуется костылём FreeAndNil.
17 мар 20, 14:34    [22100666]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
ъъъъъ
Member

Откуда:
Сообщений: 198
zedxxx
В новой версии 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;

Можно ожидать появления библиотек с упрощенным автоматическим управлением памятью. Вышел из scope -> зовется деструктор. Без старого фокуса с кривыми дельфийскими интерфейсами.
17 мар 20, 15:15    [22100704]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
Kazantsev Alexey
Вопрос в том, насколько часто ты не знаешь, где и какой тип. А также в том, для чего тебе это знать. У ТС путаница произошла не от незнания, а от того, что вместо вызова метода предназначенного для освобождения объекта, он пользуется костылём FreeAndNil.

В своем коде - знаю. В чужом - да как повезет. Для чего знать? А чтобы понимать, как его вообще применять.
А вот насчет FreeAndNil это ты очень зря.
17 мар 20, 16:47    [22100770]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
rgreat
Member

Откуда:
Сообщений: 5704
FreeAndNil для массива - это дурдом.

У меня по опыту даже Finalise(arr) иногда проблемы вызывал.
А вот Setlength(arr,0) работает надежно и предсказуемо.

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

Откуда:
Сообщений: 4200
Василий 2
А чтобы понимать, как его вообще применять.

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

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

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

Откуда:
Сообщений: 5
rgreat
А вот Setlength(arr,0) работает надежно и предсказуемо.

Ещё можно писать:
arr := nil;

но ни это, ни SetLength особого смысла не несут, т.к. массив и так будет автоматически уничтожен при выходе из области видимости.
17 мар 20, 17:16    [22100794]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
rgreat
Member

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

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

Да и Setlengh нужен только в момент обнуления перед повторным использованием массива.

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

Откуда:
Сообщений: 4200
rgreat
У меня по опыту даже Finalise(arr) иногда проблемы вызывал.

Кровавые подробности? Так-то Finalize и SetLength(..., 0) сводятся к вызову одних и тех же процедур.
17 мар 20, 17:18    [22100798]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
rgreat
Member

Откуда:
Сообщений: 5704
Kazantsev Alexey
Кровавые подробности?
AV.
При смене на SetLength(x,0) проблема прошла.
Код был не мой, и разбираться было в лом.
Дело было минимум лет 10 назад. С тех пор Finalize я не пользую принципиально. Хотя и раньше не понимал его смысла в применении к массиву.
Так-то Finalize и SetLength(..., 0) сводятся к вызову одних и тех же процедур.
А вот как-то так.

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

Откуда: Казань
Сообщений: 6592
Если верить интернету, динамические массивы введены в обджект паскаль, чтобы народ не мучился с выделением памяти. Так нет, теперь им еще конструкторы/деструкторы подавай :)
17 мар 20, 17:52    [22100824]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
alekcvp
Member

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

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

Ага, если вы объявляете в локальных переменных какой-нибудь управляемый тип, вроде string или array of ... , то это автоматически добавляет неявный try - finally. Это надо иметь в виду, когда пишите функции, которые планируете вызывать много раз в цикле.
18 мар 20, 09:26    [22101077]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
Kazantsev Alexey
FreeAndNil не просто костыль, а опасный костыль. Что данный топик неиллюзорно символизирует.

Что тут еще сказать... разве что вспомнить пословицу "Сдуру можно и х.. сломать"
18 мар 20, 09:52    [22101102]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26442
Kazantsev Alexey
FreeAndNil не просто костыль, а опасный костыль. Что данный топик неиллюзорно символизирует.

Ну да - "убивает пуля, а не человек".
18 мар 20, 09:56    [22101106]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
vavan
Member

Откуда: Казань
Сообщений: 3489
alekcvp
если вы объявляете в локальных переменных какой-нибудь управляемый тип, вроде string или array of ... , то это автоматически добавляет неявный try - finally. Это надо иметь в виду, когда пишите функции, которые планируете вызывать много раз в цикле
да даже объявлять явных не надо, там неявных с аналогичными последствиями столько порой может нагенериться, что влияние в плотных циклах может оказаться весьма заметным
18 мар 20, 10:00    [22101109]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4200
wadman
Ну да - "убивает пуля, а не человек".

Зри в корень.
18 мар 20, 10:24    [22101134]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
goldmi45
Member

Откуда:
Сообщений: 1234
Kazantsev Alexey
FreeAndNil не просто костыль, а опасный костыль. Что данный топик неиллюзорно символизирует.

http://docwiki.embarcadero.com/Libraries/Rio/en/System.SysUtils.FreeAndNil
То, что FreeAndNil не ругается и позволяет использовать в качестве аргумента ссылку на массив записей (TArray<rVariables>), говорит о том, что среда считает её object reference. Наверное, это не совсем правильно, что среда позволяет такое писать:
procedure Foo;
var
  a: Integer;
begin
  a := 2;
  FreeAndNil(a);
end;
18 мар 20, 10:47    [22101153]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
Kazantsev Alexey
Member

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

Какой, блин, обжект референс, когда там параметр нетипизированный
18 мар 20, 11:18    [22101179]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
goldmi45
Member

Откуда:
Сообщений: 1234
Kazantsev Alexey,

Да, параметр нетипизирован. Но в процедуре тупо приводится к объекту.
18 мар 20, 11:31    [22101190]     Ответить | Цитировать Сообщить модератору
 Re: Удаление TArray вызывает ошибку, почему?  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4200
goldmi45
Да, параметр нетипизирован.

Вот поэтому на вход и можно подать всё что угодно, а вовсе не от того, что среда делает какие-то предположения.
18 мар 20, 11:53    [22101219]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Delphi Ответить