Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 25.12.2017, 07:31   #1
Shouldercannon
Профессионал
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Адрес: Пенза
Сообщений: 1,773
Репутация: 226

icq: 473732523
Вопрос Очистить 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, 10:40   #2
evg_m
Профессионал
 
Регистрация: 20.04.2008
Сообщений: 4,738
Репутация: 2097
По умолчанию

Цитата:
Как правильно очистить Record?
так же как и очистить такие переменные
Код:

var
    s: String;
    I: Integer;

т.е. "очистить" по-отдельности ее составляющие в соответствии с "правилами очистки" таких переменных
__________________
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 25.12.2017 в 10:43.
evg_m вне форума   Ответить с цитированием
Старый 25.12.2017, 10:46   #3
Aliens_wolfs
Участник клуба
 
Регистрация: 16.12.2009
Адрес: WWW ЛЕНИНГРАД СПб точка РУ
Сообщений: 856
Репутация: 435
По умолчанию

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 в 10:54.
Aliens_wolfs вне форума   Ответить с цитированием
Старый 25.12.2017, 11:26   #4
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 17,984
Репутация: 6304
По умолчанию

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

Последний раз редактировалось Аватар; 25.12.2017 в 11:31.
Аватар вне форума   Ответить с цитированием
Старый 25.12.2017, 11:35   #5
Aliens_wolfs
Участник клуба
 
Регистрация: 16.12.2009
Адрес: WWW ЛЕНИНГРАД СПб точка РУ
Сообщений: 856
Репутация: 435
По умолчанию

Ну тогда так для строк
Код:

SetLength(MyRecord.s, 0);

a для числовых так чтобы не очищать большую кучу числовых параметров по отдельности
Код:

FillChar(MyRecord, SizeOf(MyRecord), 0);


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

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

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

в данном случае вполне достаточно:
Код:

  MyRecord.s := '';
  MyRecord.I := 0;

Serge_Bliznykov вне форума   Ответить с цитированием
Старый 25.12.2017, 12:45   #7
Aliens_wolfs
Участник клуба
 
Регистрация: 16.12.2009
Адрес: WWW ЛЕНИНГРАД СПб точка РУ
Сообщений: 856
Репутация: 435
По умолчанию

Цитата:
в данном случае вполне достаточно:
Код:
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 в 12:58.
Aliens_wolfs вне форума   Ответить с цитированием
Старый 25.12.2017, 12:57   #8
evg_m
Профессионал
 
Регистрация: 20.04.2008
Сообщений: 4,738
Репутация: 2097
По умолчанию

Цитата:
Так а если много переменных к примеру 20?
и надо делать много раз(а иначе зачем очищать?)
написать для этого
Код:

procedure ClearMyRecord(var work: MyRecord);

или в НЕКОТОРЫХ случаях возможно и так
Код:

function EmptyRecord: MyRecord;

ЕСЛИ... присвоение "пустой" записи СМОЖЕТ корректно очистить внутренние объекты.

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

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

Последний раз редактировалось evg_m; 25.12.2017 в 13:11.
evg_m вне форума   Ответить с цитированием
Старый 25.12.2017, 13:03   #9
Aliens_wolfs
Участник клуба
 
Регистрация: 16.12.2009
Адрес: WWW ЛЕНИНГРАД СПб точка РУ
Сообщений: 856
Репутация: 435
По умолчанию

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

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

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

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

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

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

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


04:58.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru