Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.10;
Скачать: CL | DM;

Вниз

Время жизни объекта.   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.036 c
3-1151502224
antoxa2005
2006-06-28 17:43
2006.09.10
Вопросик. Сколько клиентов можно подк MS SQL 2005 Server Express


1-1154327198
KygECHuK
2006-07-31 10:26
2006.09.10
Проблема с иницилизацией переменных


15-1155824318
Дураг
2006-08-17 18:18
2006.09.10
А вы еще пользуетесь зомбоящиками?


2-1155760160
Vovan#1
2006-08-17 00:29
2006.09.10
Wizard, Options - такого типа окна


3-1152098680
antoxa2005
2006-07-05 15:24
2006.09.10
Подскажите, а как организовать блокировку записи MS SQL Server