Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Освобождение объектов


emelin ©   (2007-09-21 17:54:00) 

Здравствуйте, подскажите плиз. Если я создаю объект
myClass := TmyClass.Create;\
а потом  не освободив  память для этой же переменной myClass в цикле создаю новый объект, а освобождаю потом один раз после цикла
myClass.Free
очистится вся память или надо делать free тоже в цикле?


Anatoly Podgoretsky   (2007-09-21 19:00:00) [1]

> emelin  (21.09.2007 17:54:00)  [0]

Если ты это делаешь в цикле, то ты потерял все созданые объекты, кроме последнего.


Юрий Зотов   (2007-09-21 18:41:00) [2]

> emelin   (21.09.07 18:03) [3]
> поля всех элементов массива FEmployer: array of TEmployers пусты.

Они и должны быть пусты. У Вас же в теле цикла такая схема:
1. Создали объект.
2. Проинициализировали его.
3.. Запомнили ссылку на него в массиве.
4. Уничтожили его.

Вопрос - куда теперь указывает ссылка из массива?
Ответ: на объект, которого уже нет. То есть, в никуда.

А спрашивали Вы о другом.


Плохиш   (2007-09-21 18:31:00) [3]


> Ega23 ©   (21.09.07 18:11) [7]

Пора тебе отдахнуть :-) Представляешь как твой пример работать будет? :-))


> emelin   (21.09.07 18:03) [3]

Твой вопрос звучит несколько иначе, ненаходишь?


Ega23   (2007-09-21 18:11:00) [4]


> то после цикла в FEmployer - поля всех элементов массива
> FEmployer: array of TEmployers пусты.


Здесь оно и не нужно.
Кстати, код можно так переписать:
for i := 0 to 5 do
begin
SetLength(FEmployer, i);
FEmployer[i] := TEmployers.Create;
With  FEmployer[i] do
 begin
  FInd := 'ааа';
  FNote := 'bbb';
 end;
end;


Kolan   (2007-09-21 18:10:00) [5]

> Если делать так:

Делай так:

 TEmployer = class

 end;

 TEmployersList = class(TObjectList)
 private
   function GetItem(Index: Integer): TEmployer;
   procedure SetItem(Index: Integer; const Value: TEmployer);
 public
   function Add(Employer: TEmployer): Integer;
   property Items[Index: Integer]: TEmployer read GetItem write SetItem;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
 Employers: TEmployersList;
 Employer: TEmployer;
begin
 Employers := TEmployersList.Create;
 try
   Employer := TEmployer.Create;
   // Так обращаться к полям не надо, сделай свойства.
   //Employer.FInd := 'ааа';
   //Employer.FNote := 'bbb';
   Employers.Add(Employer);
 finally
   Employers.Free;
 end;
end;

{ TEmployersList }

function TEmployersList.Add(Employer: TEmployer): Integer;
begin
 Result := inherited Add(Employer);
end;

function TEmployersList.GetItem(Index: Integer): TEmployer;
begin
 Result := inherited Items[Index] as TEmployer;
end;

procedure TEmployersList.SetItem(Index: Integer; const Value: TEmployer);
begin
 inherited Items[Index] := Value;
end;


Ega23   (2007-09-21 18:08:00) [6]


> Kolan ©   (21.09.07 18:04) [4]
>
> Можно сделать так:
>
> if Assigned(myClass) then
>  FreeAndNil(myClass);
> myClass := TmyClass.Create;


Строки кода идут именно в таком порядке, то Free достаточно.


Kolan   (2007-09-21 18:04:00) [7]

Можно сделать так:

if Assigned(myClass) then
 FreeAndNil(myClass);
myClass := TmyClass.Create;


emelin   (2007-09-21 18:03:00) [8]


> В цикле.

Если делать так:
for i := 0 to 5 do
begin
 SetLength(FEmployer, i);
 Employer := TEmployers.Create;
 Employer.FInd := 'ааа';
 Employer.FNote := 'bbb';
 FEmployer[i-1] := Employer;
 Employer.Free;
end;

то после цикла в FEmployer - поля всех элементов массива FEmployer: array of TEmployers пусты.


Ega23   (2007-09-21 17:57:00) [9]

myClass - это всего лишь указатель.
Если ты его потом сохраняешь где-то (в TList, например) для последующего освобождения - то не надо. А если сделать подряд
myObj := TMyObject.Create;
myObj := TMyObject.Create;

то будет создано ДВА экземпляра класса TMyObject, но на первый ссылка будет потеряна и он будет занимать память вплоть до завершения процесса.


Юрий Зотов   (2007-09-21 17:56:00) [10]

В цикле.


Наверх

Титульная страница Поиск, карта сайта Написать письмо