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

Вниз

Будет ли автоматически удален объект... ?   Найти похожие ветки 

 
Bel ©   (2003-12-05 09:15) [0]

Будет ли автоматически удален объект, являющийся полем формы?
Пример:

type
TMyForm = class(TForm)
...
private
{ Private declarations }
SomeList: TStringlist;
end;

procedure TMyForm.FormCreate(Sender: TObject);
begin
SomeList := TStringlist.Create;
end;

И все. SomeList.Free нигде нету.


 
Digitman ©   (2003-12-05 09:18) [1]

нет, не будет
в данном случае ты сам создал объект - ты и ответственен за его последующее уничтожение


 
alex_***   (2003-12-05 09:25) [2]

Форма просто не знает про него...


 
Reindeer Moss Eater ©   (2003-12-05 09:33) [3]

Она знает про него, но у нее нет деструктора, который бы знал про этот стринглист.


 
alex_***   (2003-12-05 09:39) [4]

А как это она знает про него?


 
Skier ©   (2003-12-05 09:39) [5]


> Будет ли автоматически удален объект, являющийся полем формы?

Нет.


 
Reindeer Moss Eater ©   (2003-12-05 09:41) [6]

А как это она знает про него?

Класс ничего не знает про собственное поле?
Только про это поле?
Класс ничего не знает про все свои поля?


 
alex_***   (2003-12-05 09:49) [7]

Сам класс - да. не знает. если загнать в property и в published, тогда через RTTI можно вытащить. или я чего-то не понимаю после вчерашней зарплаты.. ))


 
Reindeer Moss Eater ©   (2003-12-05 09:52) [8]

тогда через RTTI можно вытащить.

Тогда узнаешь ты об этом поле, а не класс формы.


 
alex_***   (2003-12-05 09:52) [9]

Ну или использовать что-то типа Owner"a, Parent"a ... Тогда через Controls[i] и все такое но это опять же, можно сказать, ловкость рук...


 
alex_***   (2003-12-05 09:58) [10]

>Класс ничего не знает про собственное поле?
>Только про это поле?
>Класс ничего не знает про все свои поля?

Что-то я потерял нить..
Что ты хотел этим сказать?


 
Anatoly Podgoretsky ©   (2003-12-05 10:00) [11]

Не надо фантазировать!
Ответ был еще в номере 1, и потом повторялся.
Освобождать надо самому.


 
Reindeer Moss Eater ©   (2003-12-05 10:00) [12]

А что ты хотел сказать тем, что форма ничего не знает про поле, отвечая на вопрос будет ли удален объект стринглист?

Не будет удален потому что не знает?


 
Anatoly Podgoretsky ©   (2003-12-05 10:02) [13]

Вообще то если точно, то объект будет уничтожен, но только сам объект, а не его содержимое.


 
Юрий Зотов ©   (2003-12-05 10:02) [14]

Про свои поля класс, конечно, знает. Но не все. Например, он знает что поле вообще существует, знает его размер и смещение, знает его тип (и в даном случае знает, что этот тип - ссылка на объект).

Но класс понятия не имеет, на какой именно объект это поле ссылается - на свой собственный или на какой-то внешний. Он не знает, был ли этот объект вообще создан, был ли он уже удален или еще существует - и пр.

Но самое главное, чего не знает класс - так это то, что он не знает задумки программиста. А потому он не знает, кто именно должен этот объект уничтожать. Сам этот класс, какой-то другой класс, или программист - ручками.

Вот по этой причине класс ничего и не уничтожает. Справедливо полагая, что программисту виднее, что, когда и где должно быть (или не быть) уничтожено.

P.S.
Речь шла о некомпонентских классах, либо о компонентах, не имеющих владельца. ПОтому что для компонентов с Owner <> nil дело обстоит иначе.


 
Reindeer Moss Eater ©   (2003-12-05 10:07) [15]

Класс что-то не уничтожает только потому, что использует свой или унаследованный деструктор который имеет вполне конкретную реализацию.

Деструктор TForm тот как раз ничего и не удаляет из полей TMyForm про которые слыхом ничего не слыхивал.


 
alex_***   (2003-12-05 10:10) [16]

Тяжелая артиллерия подошла ))
Интересно стало.. Я просто этим раньше не заморачивался, как класс может узнать размер отдельного поля и его тип?

>Вообще то если точно, то объект будет уничтожен, но только сам >объект, а не его содержимое.

тоже не понимаю.. с удалением класса будет уничтожен кусок памяти в котором лежит поинтер на объект... а сам объект так и будет жить, пока процесс не будет выгружен. на мой взгляд.. или я не прав?


 
Bel ©   (2003-12-05 10:13) [17]

Вау! Вот это дискуссию развели! :-))

Я к чему это спросил. Посмотрите в демках, идущих с Делфи 6 (в других не знаю, но, наверное, то же самое), проект по QuickReport"у, который называется qr3demo. Там в форме frmOnNeedData такая ситуация. Вот я и засомневался: то ли я чего-то не понимаю, то ли у того, кто писал эту демку, руки кривые.


 
alex_***   (2003-12-05 10:18) [18]

Ну забыли люди Free дать... ну с кем не бывает.


 
Anatoly Podgoretsky ©   (2003-12-05 10:26) [19]

alex_*** (05.12.03 10:10) [16]
(Последний абзац) понят правильно.


 
Hawk2 ©   (2003-12-05 10:30) [20]

А если в коде создания написать следующее:

procedure TMyForm.FormCreate(Sender: TObject);
begin
SomeList := TStringlist.Create( Self);
end;

тогда при закрытии формы объект будет удален?


 
alex_***   (2003-12-05 10:33) [21]

хе... пойди найди такой конструктор у TStringList..


 
Юрий Зотов ©   (2003-12-05 10:35) [22]

> Reindeer Moss Eater © (05.12.03 10:07) [15]

Не совсем так, наверное.

То, что удаляется в деструкторе - это все же удаляется написавшим деструктор программистом, а не самим классом. Имеется в виду, что компилятор не строит кода какого-либо автоматического удаления - он просто компилирует код программиста. В отличие, скажем, от CleanupInstance, вызов которого компилятор действительно вставляет автоматически.

> alex_*** (05.12.03 10:10) [16]

> как класс может узнать размер отдельного поля и его тип?

Тип Вы пишете сами, при объявлении поля. А его размер запросто определяется через SizeOf(тип). Поэтому класс все знает, и именно поэтому его метод NewInstance знает, какой размер памяти требуется выделить под экземпляр класса. В VMT класс этот размер даже сидит и возвращает его InstanceSize.

> с удалением класса будет уничтожен кусок памяти в котором
> лежит поинтер на объект... а сам объект так и будет жить,

Во-первых, класс удалить невозможно, можно удалить лишь его экземпляр (то есть, ранее созданный объект этого класса).

Во-вторых, "физически" объект - это всего лишь совокупность его полей, размещенная в динамической памяти. Удаление объекта означает освобождение занятой этими полями области памяти, и ничего более.

А "пойнтер на объект" обычно находится как раз в статической памяти и поэтому удалить его невозможно. При удалении объекта, на который указывает этот пойнтер, с самим пойнтером вообще ничего не происходит. Даже его значение не меняется.


 
Hawk2 ©   (2003-12-05 10:38) [23]

Точно нет.


 
Bel ©   (2003-12-05 10:38) [24]

> Anatoly Podgoretsky © (05.12.03 10:26) [19]
> alex_*** (05.12.03 10:10) [16]
> (Последний абзац) понят правильно.

Вопрос в догонку. А что будет с памятью, занятой под этот объект, когда процесс завершится (имеется ввиду корректное завершение)? Освободится ли она?


 
Reindeer Moss Eater ©   (2003-12-05 10:39) [25]

Юрий Зотов © (05.12.03 10:35) [22]
> Reindeer Moss Eater © (05.12.03 10:07) [15]

Не совсем так, наверное.


Конечно не совсем так. Но только потому, что есть классы написанные неприкладными программистами, а разработчиком.
Может так?


 
alex_***   (2003-12-05 10:54) [26]

дискуссия пошла.. ))
ну понятно что общий размер можно вытащить, можно вытащить VMT. Но если мы знаем что в данной области памяти размещен экземпляр объекта и что он унаследован от TObject, то список полей получить-то мы не сможем... ну и размер поля определяет компиллятор и самому классу по-барабану до него.

Про удаление класса это уже вопрос терминологии, я так понимаю. Удалить класс - стереть .pas )) Класс как таковой, в отличие от его экземпляра, понятие абстракное и вопрос про его удаление не корректен, на мой взгляд.

Что такое статическая область памяти в которой лежат поинтеры?

А память занимаемая процессом сносится системой, которая следит какие куски закреплены за ним.

P.S.
Такое впечатление что все говорят разными словами про одно и тоже.


 
Reindeer Moss Eater ©   (2003-12-05 10:59) [27]

Класс как таковой, в отличие от его экземпляра, понятие абстракное и вопрос про его удаление не корректен, на мой взгляд.

Класс - это тоже объект.


 
Reindeer Moss Eater ©   (2003-12-05 11:00) [28]

По крайней мере класс OP


 
alex_***   (2003-12-05 11:01) [29]

ну пока ты его не создал это ничто.


 
Reindeer Moss Eater ©   (2003-12-05 11:04) [30]

Класс как таковой, в отличие от его экземпляра, понятие абстракное и вопрос про его удаление не корректен, на мой взгляд.

Ну и в чем же тогда отличие состоит на твой взгляд?
Пока экзепляр не создан, он, тем не менее, уже НЕЧТО?


 
alex_***   (2003-12-05 11:07) [31]

экземпляр имеет адрес, размер и все такое. а класс это умные (и не очень) мысли :))


 
Reindeer Moss Eater ©   (2003-12-05 11:11) [32]

экземпляр имеет адрес, размер и все такое...
Созданный экземпляр!


 
alex_***   (2003-12-05 11:13) [33]

ну да... не созданных экземляров я и не встречал ))


 
Anatoly Podgoretsky ©   (2003-12-05 11:16) [34]

StringList := nil;


 
alex_***   (2003-12-05 11:22) [35]

>StringList := nil;

и что это?


 
alex_***   (2003-12-05 11:33) [36]

если речь про статические методы, то в Txxx.Some(); Txxx - типа namespace"a. Я отваливаю - работать пора нормально. Всем пока и удачного дня.


 
han_malign ©   (2003-12-05 11:36) [37]

> Вопрос в догонку. А что будет с памятью, занятой под этот объект, когда процесс завершится (имеется ввиду корректное завершение)? Освободится ли она?
- это уже зависит от конкретной ОС - в семействе Win NT(начиная с урезанной Win98), при закрытии(и снятии, даже некорректном) процесса, освобождается вся виртуальная память запрошенная процессом(просто удаляется LDT), и закрываются все Handle на объекты системы(вернее почти все, в некоторых ситуациях могут "протечь" ключи реестра(в XP проблема тоже присутствует), причем после этого велика вероятность синего экрана смерти).



Страницы: 1 вся ветка

Текущий архив: 2003.12.16;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.02 c
14-52389
Knight
2003-11-21 01:12
2003.12.16
Можно ли передвинуть курсор так...


14-52358
undert
2003-11-21 23:51
2003.12.16
Strings and DOS


3-52083
sokohigh
2003-11-17 20:22
2003.12.16
ExpressQuantumGrid4 + ExpressEditors Library 4


14-52383
Vlad Oshin
2003-11-21 16:36
2003.12.16
Михаилов с праздником!


9-52048
Андрей
2003-05-30 18:55
2003.12.16
DelphiX