Текущий архив: 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.47 MB
Время: 0.032 c