Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-52247
NneRreaLl
2003-12-04 14:32
2003.12.16
Как удалить часть файла -- указать начальную и конечную позицию ?


14-52364
K.o.Z
2003-11-23 00:40
2003.12.16
Drag`n`drop


6-52328
Toxa
2003-10-22 10:49
2003.12.16
Как с помощью TIdHTTP послать POST.


14-52346
Ord3f8h
2003-11-23 17:31
2003.12.16
Полный мануал по работе с файлами и вопрос


3-52084
chtr
2003-11-24 16:01
2003.12.16
Подскажите фишку:





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский