Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.08.28;
Скачать: [xml.tar.bz2];

Вниз

Уничтожение поле класса   Найти похожие ветки 

 
Skier   (2003-08-15 15:00) [0]

Правильно ли писать так ?
(хотя AV нет, но я не уверен)

destructor TSomeClass.Destroy;
begin
inherited Destroy;
FSomeObject.Free; //FSomeObject - поле класса TSomeClass
end;

Не является ли криминалом писать FSomeObject.Free после inherited Destroy;


 
Игорь Шевченко   (2003-08-15 15:01) [1]

Нет, деструктор же не вызывает FreeInstance, другое дело, что это не очень наглядно, лучше бы их местами поменять


 
Skier   (2003-08-15 15:04) [2]

>Игорь Шевченко © (15.08.03 15:01) [1]
Нет, в смысле такой код будет правильным ?
Дело в том что идёт обращение к FSomeObject в теле деструктора предка...


 
Игорь Шевченко   (2003-08-15 15:07) [3]

Привел бы ты побольше кода..Код будет правильным, я не вижу причин для неправильности, тем более, с учетом твоего замечания про обращение в деструкторе предка.


 
Skier   (2003-08-15 15:10) [4]

>Игорь Шевченко © (15.08.03 15:07) [3]

> Привел бы ты побольше кода..

Там слишком длинная "цепочка", до утра буду приводить... :)

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

Спасибо. Развеял мои сомнения...:)


 
Calm   (2003-08-15 15:37) [5]


> Дело в том что идёт обращение к FSomeObject в теле деструктора
> предка...

Так может перенести FSomeObject в предка?
Или как-то оповещать предка о том, что FSomeObject уже освобожден, например делая ему не .Free, а FreeAndNill?


 
Skier   (2003-08-15 15:43) [6]

>Calm © (15.08.03 15:37) [5]
Не пойдёт... В том-то и дело что FSomeObject должен быть доступен
до тех пор пока деструктор не отработает, т.е. деструктор должен всегда "видеть" FSomeObject.
Оповещать, конечно можно, но тот код который я привёл был бы
самым простым решением в моей ситуации...


 
Юрий Федоров   (2003-08-15 15:50) [7]

Я думаю, что это вполне нормально


 
Sandman25   (2003-08-15 15:57) [8]

Если предок "видит" FSomeObj, значит FSomeObj объявлен в этом предке или еще раньше. Почему же тогда FSomeObj не освобождается в предке?
Или FSomeObj в предке не создается? Тогда стоит перенести объявление FSomeObj в тот из предков, где он действительно используется. ИМХО.


 
Skier   (2003-08-15 16:04) [9]

>Sandman25 (15.08.03 15:57) [8]
Ты конечно, прав, но предок это класс, код которого нельзя править, поскольку это самостоятельная стороняя библиотека, к тому же работующая с электронным ключом защиты.
Про сторонюю библиотеку мне следовало бы сказать сразу, в вопросе, каюсь...


 
Юрий Федоров   (2003-08-15 16:11) [10]

как так получилось что самостоятельная стороняя библиотека знает о твоем FSomeObj?


 
Skier   (2003-08-15 16:15) [11]

>Юрий Федоров © (15.08.03 16:11) [10]

> как так получилось что самостоятельная стороняя библиотека
> знает о твоем FSomeObj?

Он не знает. Знает наследник класса. А в предке в деструкторе
вызвается событие OnDestroy, обработчик которого присваивается в
наследнике.


 
Sandman25   (2003-08-15 16:15) [12]

Skier © (15.08.03 16:04)

Понятно. Некорректно написанная библиотека.


 
Sandman25   (2003-08-15 16:20) [13]

Skier

Можно вызвать OnDestroy самому.
А потом уже очищать FSomeObj и вызывать inherited Destroy.


 
Skier   (2003-08-15 16:21) [14]

>Юрий Федоров © (15.08.03 16:11) [10]
[10] + и в этом FSomeObj содержатся некие данные, которые используются в обработчике OnDestroy предка.
Такой вот ребус...:)


 
Sandman25   (2003-08-15 16:22) [15]

Хотя вообще-то это странно. Лучше код из OnDestroy переместить в деструктор наследника. Ведь он всегда один и тот же для данного класса, так?


 
Skier   (2003-08-15 16:23) [16]

>Sandman25 (15.08.03 16:20) [13]

> Можно вызвать OnDestroy самому.

Нет. Мне нужно лишь "привязать" обработчик события, а когда его
вызывать предок "определяет" сам. В том-то вся и штука...


 
Sandman25   (2003-08-15 16:23) [17]

Или как вариант, засунуть FSomeObject.Free в OnDestroy :)


 
Толик   (2003-08-15 16:30) [18]

to Skier © (15.08.03 15:00)
В момент вызова inherited Destroy реального разрушения объекта не происходит. Просто компилятору даётся указание выполнить унаследованный код, не более того. А вот вызов _ClassDestroy компилятор встраивает сам в конец деструктора именно того класса, к которому принадлежит объект. Так что всё написано правильно, а чтобы развеить все сомнения на MyObject.Free() надо поставить break point b посмотреть последовательность вызовов через CPU Window, тогда всё станет ясно.


 
Skier   (2003-08-15 16:32) [19]

>Sandman25
OnDestroy это был просто как пример у других классов другие
события, не хотелось бы каждый раз когда пишеться наследник, определять "где же лучше освободить FSomeObject ?", ведь можно
просто написать освобождение после inherited Destroy, тем более
это не является криминалом.


 
Юрий Федоров   (2003-08-15 16:33) [20]

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


 
Skier   (2003-08-15 16:34) [21]

>Толик © (15.08.03 16:30) [18]
> Так что всё написано правильно, а чтобы развеить все сомнения
> на MyObject.Free() надо поставить break point b посмотреть
> последовательность вызовов через CPU Window, тогда всё станет
> ясно.

А ты думаешь я не смотрел ?
Но просто взяло меня сомнение и всё тут...:)


 
Skier   (2003-08-15 16:40) [22]

>Юрий Федоров © (15.08.03 16:33) [20]
Прав, но в моём случае это не всегда возможно, т.е. не у всех
классов сторонней библиотеки есть методы, которые можно было бы
перекрыть для решения этой задачи, так что единственный выход для
меня это - обработчики событий.

> Тут безусловно вопрос о стиле, а не ошибках с осводождением
> памяти.

И даже не в стиле...:) В "обычной жизни" я всегда пишу освобождение полей перед inherited Destroy.
А тут, я просто вынужден отойти от привычки и изменить себе. :)


 
Юрий Федоров   (2003-08-15 16:43) [23]

Ну так ты же присвоил "OnDestroy...". Почему бы этот метод не вызвать в деструкторе самому вместо присваивания в качестве события предку?


 
Skier   (2003-08-15 16:46) [24]

>Юрий Федоров © (15.08.03 16:43) [23]
см. [19]


 
Юрий Федоров   (2003-08-15 16:52) [25]

переопредели FreeInstance :-)))


 
Skier   (2003-08-15 16:54) [26]

>Юрий Федоров © (15.08.03 16:52) [25]
:)



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

Форум: "Основная";
Текущий архив: 2003.08.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.006 c
14-92211
Viktor Kushnir
2003-08-09 09:27
2003.08.28
Да кто эту глючную кладовку вообще делал?


3-92030
natali
2003-08-04 17:02
2003.08.28
QReport


1-92094
Man
2003-08-15 13:30
2003.08.28
работа с dll в Inno Setup


3-91988
Ditrix
2003-08-06 11:38
2003.08.28
Locate в FIBDataset


3-92015
Малой
2003-08-05 11:33
2003.08.28
Как в стандарте ANSI натйти агрегат от агрегата?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский