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