Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.10.14;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.06 c
2-1190198322
Василий
2007-09-19 14:38
2007.10.14
Как изменить внешний вид


15-1189831668
Aller
2007-09-15 08:47
2007.10.14
порты в freebsd


2-1190022039
Владимир_А
2007-09-17 13:40
2007.10.14
file


2-1190331893
NickEr
2007-09-21 03:44
2007.10.14
Проверка числа на симметричность


15-1174917080
bva
2007-03-26 17:51
2007.10.14
Где купить лицензионную Delphi5,6,7





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский