![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Освобождение объектов
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]В цикле.