![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Время жизни объекта.
Grant © (2006-07-26 19:10:00)Всем привет. Прошу прощения за глупый вопрос, но помогите, пожалуйста, разобраться. Если есть где почитать то дайте ссылочку. Собственно вопрос. Если есть, например, процедура и в ней объявлена переменная, то если я правильно понимаю, при выходе из этой процедуры переменная перестанет существовать, то есть память под нее не будет выделяться?
Второй вариант. Всё в той же процедуре создается объект класса(переменная описывающая объект объявлена внутри этой процедуры). При выходе из этой процедуры объект разрушиться?(Память освободиться?). Заранее спасибо.
begin...end (2006-07-27 09:00:00) [1]<OFFTOPIC>
> Юрий Зотов © (26.07.06 21:09) [18]
Ё-моё, как же низко-то... Что ж, похоже, Вы так ничего и не поняли.
> Последний раз, обещаю.
Не стоит. Уже обещали.
> Этот ответ тоже дополняет и/или уточняет предыдущие. Но
> при этом никому не дает никаких поводов ни для каких отрицательных
> эмоций.
Мои ответы, дополняющие и/или уточняющие предыдущие, тоже не дают никаких поводов ни для каких отрицательных эмоций -- у людей, которые не считают свою точку зрения единственно верной. Люди же, которые, наоборот, считают именно так, меня интересуют мало (а то, какие эмоции я у них вызываю, меня не интересует вовсе).
</OFFTOPIC>
Сорри за оффтопик.
Германн (2006-07-26 23:58:00) [2]
> PS.Последний раз, обещаю.
<offtop>
Второй раз уже замечаю подобное высказывание. Я что-то пропустил?
</offtop>
PSPF2003 (2006-07-26 22:15:00) [3]
> сегодня у меня день невнимательности...
Аналогично, только не сегодня а всю жизнь :(
default (2006-07-26 22:14:00) [4]PSPF2003 © (26.07.06 19:57) [15]
пардон, сегодня у меня день невнимательности...
Юрий Зотов (2006-07-26 21:09:00) [5]> Grant (26.07.06 19:10)
1. Локальные переменные процедур размещаются в стеке. При выходе из процедуры происходит их выталкивание из стека и они, таким образом, перестают существовать.
2. Если локальная переменная процедуры представляет собой указатель на область динамической памяти, то сама эта переменная тоже размещается в стеке и при выходе из процедуры тоже перестает существовать. Но ведь та область памяти, на которую эта переменная указывала - она так и осталась выделенной, ее же никто не освобождал. И если на эту область нет других указателей, то после выхода из процедуры ее адрес окажется безвозвратно утерянным, освободить эту область мы уже не сможем и возникнет утечка памяти. Поэтому освобождать ее надо в самой процедуре. В частности, если эта область выделялась под объект, то его надо уничтожить.
3. Есть исключения - это так называемые данные с управляемым временем жизни (длинные строки, динамические массивы и объекты, реализующие интерфейсы). Для таких данных подсчет ссылок на них ведется автоматически и когда счетчик ссылок становится равным нулю (то есть, на эти данные уже никто не ссылается), то занимаемая ими область памяти автоматически освобождается. Если в процедуре есть ссылка на такие данные, то при выходе из процедуры счетчик ссылок на них автоматически декрементируется - соответственно, такие данные будут уничтожены тоже автоматически, без нашего участия.
PS.
Последний раз, обещаю.
begin
Этот ответ тоже дополняет и/или уточняет предыдущие. Но при этом никому не дает никаких поводов ни для каких отрицательных эмоций. Если угодно, можно использовать в качестве примера, ничуть не буду против.
end
Джо (2006-07-26 21:05:00) [6]> [13] begin...end © (26.07.06 19:39)
> Надеюсь, этот пост не будет воспринят как буквоедство :)
Нет, не будет :) Это достаточно принципиальное уточнение.
Kolan (2006-07-26 20:54:00) [7]Ну и я добавлю что прально писать так:
var
SomeObject: TSomeClass;
begin
SomeObject := TSomeClass.Create;
try
{Do something...}
finally
SomeObject.Free;
end;
end;
Это гарантирует удаление объекта...
PSPF2003 (2006-07-26 19:57:00) [8]
> default © (26.07.06 19:48) [14]
->[12]
default (2006-07-26 19:48:00) [9]PSPF2003 © (26.07.06 19:19) [9]
"Intf := TSomeObjInt.Create; // память будет освобождена автоматически |Нет"
"объект будет реализовывать какой-нибудь интерфейс с подсчетом ссылок."
begin...end (2006-07-26 19:39:00) [10]> Джо © (26.07.06 19:17) [8]
Небольшая поправка: насчёт строки -- не очень удачный пример, ИМХО. В данном случае в ходе присваивания происходит, по большому счёту, копирование в переменную S указателя на тело константной строки, память под которую была предусмотрена на этапе компиляции. И при выходе из процедуры эта память не освобождается.
Надеюсь, этот пост не будет воспринят как буквоедство :)
PSPF2003 (2006-07-26 19:26:00) [11]Извини, с интерфейсом я ошибся.
Grant (2006-07-26 19:22:00) [12]PSPF2003 тоже спасибо.
Grant (2006-07-26 19:21:00) [13]Спасибо Джо. А есть где почитать про это?
PSPF2003 (2006-07-26 19:19:00) [14]var
Obj: TObj;
S: string;
Intf: IUnknow;
P: Pointer;
begin
Obj := TObject.Create; // память не будет освобождена автоматически |Да
S := '12345'; // память будет освобождена автоматически |Да
Intf := TSomeObjInt.Create; // память будет освобождена автоматически |Нет
GetMem (P, 1024); // память не будет освобождена автоматически |Да
end;
Джо (2006-07-26 19:17:00) [15]> [5] Grant (26.07.06 19:14)
> Так а первая часть моего вопроса правильная?
var
Obj: TObj;
S: string;
Intf: IUnknow;
P: Pointer;
begin
Obj := TObject.Create; // память не будет освобождена автоматически
S := '12345'; // память будет освобождена автоматически
Intf := TSomeObjInt.Create; // память будет освобождена автоматически
GetMem (P, 1024); // память не будет освобождена автоматически
end;
Grant (2006-07-26 19:17:00) [16]Ясно. Спасибо за помощь.
PSPF2003 (2006-07-26 19:15:00) [17]
> при выходе из этой процедуры переменная перестанет существовать
Да.
Grant (2006-07-26 19:14:00) [18]Так а первая часть моего вопроса правильная?
Джо (2006-07-26 19:13:00) [19]Зависит от типа этой переменной.
> При выходе из этой процедуры объект разрушиться
Нет. Объект нужно уничтожать manually, посредством вызова Free. За одним исключением, а именно: объект будет реализовывать какой-нибудь интерфейс с подсчетом ссылок.
PSPF2003 (2006-07-26 19:12:00) [20]
> Второй вариант. Всё в той же процедуре создается объект
> класса(переменная описывающая объект объявлена внутри этой
> процедуры). При выходе из этой процедуры объект разрушиться?
> (Память освободиться?). Заранее спасибо.
Нет.