Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.12.2017, 06:31   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,893
Вопрос Очистить Record

Есть
Код:
type
  TMyRecord = Record
    s: String;
    I: Integer;
  end;
...
var
  MyRecord: TMyRecord;
...
procedure TFormMain.BFill5Click(Sender: TObject);
begin
  MyRecord.s := 's: 5';
  MyRecord.I := 5;
end;

procedure TFormMain.BShow5Click(Sender: TObject);
var
  s: String;
begin
  if MyRecord.s <> '' then s := s + #13#10 + Format('%s = %d', [MyRecord.s, MyRecord.I]);
  ShowMessage(s);
end;
Очищаю так
Код:
Finalize(MyRecord);
Хотел использовать
Код:
FillChar(MyRecord, SizeOf(MyRecord), 0);
но вычитал, что будет утечка памяти.
Как правильно очистить Record?
Shouldercannon вне форума Ответить с цитированием
Старый 25.12.2017, 09:40   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Как правильно очистить Record?
так же как и очистить такие переменные
Код:
var
    s: String;
    I: Integer;
т.е. "очистить" по-отдельности ее составляющие в соответствии с "правилами очистки" таких переменных
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 25.12.2017 в 09:43.
evg_m вне форума Ответить с цитированием
Старый 25.12.2017, 09:46   #3
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

MyRecord: TMyRecord уже у вас объявлен в памяти
FillChar(MyRecord, SizeOf(MyRecord), 0); Не на какую память не повлияет
Для вашего спокойствия можно так
FillChar(Pointer(MyRecord)^, SizeOf(TMyRecord), 0);
либо так
Finalize(Pointer(MyRecord)^);

А если бы вы сами выделяли память например так
Код:
type
pMyRecord = ^TMyRecord; 
  TMyRecord = Record
    s: String;
    I: Integer;
  end;

var
MyRecord: pMyRecord;
begin
New(MyRecord);
//То чистить нужно так
FillChar(MyRecord^, SizeOf(TMyRecord), 0);
либо так
Finalize(MyRecord^);

Последний раз редактировалось Aliens_wolfs; 25.12.2017 в 09:54.
Aliens_wolfs вне форума Ответить с цитированием
Старый 25.12.2017, 10:26   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
FillChar(MyRecord, SizeOf(MyRecord), 0); Не на какую память не повлияет
Еще как повлияет. Забьет нулем указатель на длинную строку, а сама строка в утечки памяти))
Цитата:
Очищаю так
твой record сам корректно очистится при уходе из зоны видимости. Или см #2
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 25.12.2017 в 10:31.
Аватар вне форума Ответить с цитированием
Старый 25.12.2017, 10:35   #5
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Ну тогда так для строк
Код:
SetLength(MyRecord.s, 0);
a для числовых так чтобы не очищать большую кучу числовых параметров по отдельности
Код:
FillChar(MyRecord, SizeOf(MyRecord), 0);

Последний раз редактировалось Aliens_wolfs; 25.12.2017 в 10:40.
Aliens_wolfs вне форума Ответить с цитированием
Старый 25.12.2017, 11:22   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Aliens_wolfs Посмотреть сообщение
Ну тогда так для строк
Цитата:
Сообщение от Aliens_wolfs Посмотреть сообщение
a для числовых так
что подтверждает сказанное выше:

Цитата:
Сообщение от evg_m Посмотреть сообщение
т.е. "очистить" по-отдельности ее составляющие в соответствии с "правилами очистки" таких переменных
p.s. структуру record заполняет программист в процессе написания программы.
он и обязан следить за корректностью заполнения и очистки.
И использовать "хакерские" способы очистить память нужно крайне осторожно и аккуратно. (а лучше вообще не использовать )

в данном случае вполне достаточно:
Код:
  MyRecord.s := '';
  MyRecord.I := 0;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.12.2017, 11:45   #7
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Цитата:
в данном случае вполне достаточно:
Код:
MyRecord.s := '';
MyRecord.I := 0;
Так а если много переменных к примеру 20?
Ну а со строковыми согласен в ручную их обычно мало бывает
По отдельности чистить много переменных это запара и что то можно пропустить.
Тогда наверное лучше задавать самому в память MyRecord и ложить например в TList и TListObject для контроля и массива, а потом ее просто уничтожать
Код:
type
pMyRecord = ^TMyRecord; 
  TMyRecord = Record
    s: String;
    I: Integer;
  .......куча доп. переменных
  end;

var
MyRecord: pMyRecord;
begin
New(MyRecord);

//Уничтожение
dispose(MyRecord);

Последний раз редактировалось Aliens_wolfs; 25.12.2017 в 11:58.
Aliens_wolfs вне форума Ответить с цитированием
Старый 25.12.2017, 11:57   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Так а если много переменных к примеру 20?
и надо делать много раз(а иначе зачем очищать?)
написать для этого
Код:
procedure ClearMyRecord(var work: MyRecord);
или в НЕКОТОРЫХ случаях возможно и так
Код:
function EmptyRecord: MyRecord;
ЕСЛИ... присвоение "пустой" записи СМОЖЕТ корректно очистить внутренние объекты.

Цитата:
Тогда наверное лучше задавать самому в память MyRecord а потом ее просто уничтожать
уничтожение самого объекта(памяти для его хранения) не приводит к уничтожению памяти внутренних объектов.
Цитата:
Забьет нулем указатель на длинную строку, а сама строка в утечки памяти))
только теперь не забьет, а просто потеряет.

Цитата:
p.s. структуру record заполняет программист в процессе написания программы.
он и обязан следить за корректностью заполнения и очистки.
от очистки внутренних объектов ничто не избавит.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 25.12.2017 в 12:11.
evg_m вне форума Ответить с цитированием
Старый 25.12.2017, 12:03   #9
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Цитата:
написать для этого
Код:
procedure ClearMyRecord(var work: MyRecord);
Согласен но все же можно пропустить кое какие переменные, когда их много и что то добавляешь в ходе программирования, забудешь в эту чистку добавить переменную, это уже проверенно. Я бы тогда как в посте #5 написал для строковых по отдельности их обычно мало, а для всего остального FillChar

Цитата:
Забьет нулем указатель на длинную строку, а сама строка в утечки памяти))
Но это только для строковых неопределенной длины, да за ними нужно следить, чтобы не париться можно строку задавать определенной длины тогда все можно чистить одной функцией

Последний раз редактировалось Aliens_wolfs; 25.12.2017 в 12:17.
Aliens_wolfs вне форума Ответить с цитированием
Старый 25.12.2017, 12:23   #10
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Но это только для строковых, да за ними нужно следить, чтобы не париться можно строку задавать определенной длины тогда все можно чистить одной функцией
а как очистить( в смысле освободить память) "простую" целочисленную переменную.

Цитата:
Согласен но все же можно пропустить кое какие переменные, когда их много
это работает в обе стороны
Цитата:
и что то добавляешь в ходе программирования
вот и добавили строку.
был FillChar -- получили описанное выше.

изменили структуру --> изменили процедуру очистки.

именно поэтому(не только) и появились классы (структура ВМЕСТЕ с процедурами для их обработки).
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 25.12.2017 в 12:27.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Очистить массив Shouldercannon Общие вопросы Delphi 3 24.12.2017 22:07
Использование record в record Anton911 Общие вопросы Delphi 7 03.05.2012 08:49
очистить $_POST[] BaiAs PHP 2 24.01.2011 15:47
В чём различие записей Record от Packed Record? Terran Общие вопросы Delphi 7 08.06.2010 17:14
Record / Packed Record Alex Cones Общие вопросы Delphi 7 11.11.2009 10:43