Форум: "Основная";
Текущий архив: 2003.12.16;
Скачать: [xml.tar.bz2];
ВнизБудет ли автоматически удален объект... ? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.039 c