Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

ликбез, но все же не ясно...

513
01 сентября 2008 года
Yurec
228 / / 21.09.2005
И так,в се же не ясно, как быть.
Имеем:

MUS: array of my_class;
x:my_class;

x:=MUS[0];
MUS[0]:=MUS[1];
MUS[1]:=x;

x.free;

если теперь выполнить, например, ShowMessage(MUS[1].text), то будет ошибка, так как было выполнено x.free. Вопрос, как быть в такой ситуации? мне не нужна временная переменна x, но в то же время я хочу, чтобы MUS[1] лежало то, что я туда положил (и вопрос, что я туда таким путем MUS[1]:=x положил).
3.2K
01 сентября 2008 года
Гудвин
186 / / 22.12.2007
х - в данном случае переменная с адресом твоего класса. удали "х.free" этой процедурой освобождается память по указанному адресу.
513
01 сентября 2008 года
Yurec
228 / / 21.09.2005
Цитата: Гудвин
х - в данном случае переменная с адресом твоего класса. удали "х.free" этой процедурой освобождается память по указанному адресу.



Ок, но в таком случае:
1. Если я не удалю переменную X, то получается она будет болтаться в памяти (операций таких много=> неприятно получится). Если потом я удалю MUS[0], то что станет с X?
2. Как же все таки удалить X, чтобы не висело в памяти?

3.2K
01 сентября 2008 года
Гудвин
186 / / 22.12.2007
при старте приложения создаешь массив классов, при завершении освобождаешь, переменную х используешь только как хранитель адреса определенного объекта класса, если после операций ни один элемент массива не потеряется то соответственно и память сохранишь.
513
01 сентября 2008 года
Yurec
228 / / 21.09.2005
Цитата: Гудвин
при старте приложения создаешь массив классов, при завершении освобождаешь, переменную х используешь только как хранитель адреса определенного объекта класса, если после операций ни один элемент массива не потеряется то соответственно и память сохранишь.



Проблема в том, что во время рабюоты приложения эти вещи выполняются, не то что тысячи, а просто 10-ки тысяц раз, не очень хочется делать многие разы x:=MyClass.Create, не уничтодая потом этот самый X

288
01 сентября 2008 года
nikitozz
1.2K / / 09.03.2007
Цитата: Yurec
Проблема в том, что во время рабюоты приложения эти вещи выполняются, не то что тысячи, а просто 10-ки тысяц раз, не очень хочется делать многие разы x:=MyClass.Create, не уничтодая потом этот самый X



Этого и не надо делать. Переменная x - это просто указатель на один из объектов класса, много памяти она не занимает, сколько бы раз не выполнялся цикл. Вот это строчка x.free; в вашей операции обмена вообще лишняя. Если беспокоитесь о том, что можете обратиться к x после того, как объект на который она указывает уже разрушен, после использования x присвойте ей значение nil. Что-то я не совсем понял, почему вам так хочется уничтожить x.

513
02 сентября 2008 года
Yurec
228 / / 21.09.2005
Только из-за памяти и хочется ее уничтожить. Если их, этих Х, будут миллионы?
14
02 сентября 2008 года
Phodopus
3.3K / / 19.06.2008
Код:
var
  MUS: array of my_class;

somefunc():;
var
  i: ..
  x:my_class;
begin
  for i:=Low(MUS) to High(MUS) do
    MUS := my_class.Create(); //_СОЗДАЮТСЯ_ объекты

  x:=MUS[0]; //Дополнительный объект НЕ СОЗДАЕТСЯ. Только ССЫЛКА и то не создается а изменяется
  MUS[0]:=MUS[1];
  MUS[1]:=x;

  //x.free; X - это лишь вторая ССЫЛКА на объект как и MUS[1], уничтожать сам объект по этой ссылке не надо!
end;
//По выходу из области видимости ссылка уничтожается самостоятельно

//не забыть это:
somefunc2():;
  i: ..
begin
  for i:=Low(MUS) to High(MUS) do
    MUS.Free; //_УНИЧТОЖАЮТСЯ_ _ОБЪЕКТЫ_ ПО _ССЫЛКАМ_ MUS
end;


Всё!
Верь мне.
513
03 сентября 2008 года
Yurec
228 / / 21.09.2005
TO Phodopus
Спасибо, теперь все выяснилось.
P.S. Как хочется в это верить! :)
303
03 сентября 2008 года
makbeth
1.0K / / 25.11.2004
Yurec, Phodophus абсолютно прав! А тебе стоит не в "верю-не верю" играть, а таки матчасть подучить ;)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог