Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.14;
Скачать: CL | DM;

Вниз

Освобождение объектов   Найти похожие ветки 

 
emelin   (2007-09-21 17:54) [0]

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


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

В цикле.


 
Ega23 ©   (2007-09-21 17:57) [2]

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

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


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


> В цикле.

Если делать так:
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 пусты.


 
Kolan ©   (2007-09-21 18:04) [4]

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

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


 
Ega23 ©   (2007-09-21 18:08) [5]


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


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


 
Kolan ©   (2007-09-21 18:10) [6]

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

Делай так:

 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:11) [7]


> то после цикла в 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;


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


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

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


> emelin   (21.09.07 18:03) [3]

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


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

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

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

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

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


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

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

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



Страницы: 1 вся ветка

Текущий архив: 2007.10.14;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.028 c
2-1189763049
Lebedev
2007-09-14 13:44
2007.10.14
MMSYSTEM281 в ОС WIN98, с прогой Delphi (MediaPlayer).


15-1189770684
NeedForHelpAlways
2007-09-14 15:51
2007.10.14
Как сделать словарь терминов?


15-1189948250
max_
2007-09-16 17:10
2007.10.14
atan


6-1171264410
vasilii_terkin
2007-02-12 10:13
2007.10.14
Проблема с приложением клиент/сервер


2-1189687949
Havismat
2007-09-13 16:52
2007.10.14
Про окна, вопрос новичка