![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Уничтожение объекта переданного в метод [D5]
De © (2006-06-01 11:54:00)в методе нужно создать объект и передать его в другой объект
myCl2 : TmyClass2;
...
procedure TmyClass.MyMethod;
var
myCl3 : TmyClass3;
begin
myCl3 := TmyClass3.Create;
myCl2.Add(myCl3);
end;
но возникает вопрос где он должен быть уничтожен?
umbra (2006-06-01 12:37:00) [1]2 tesseract © (01.06.06 12:29) [12]
> Данная функциональность в нём есть,
нет там такой функциональности. Там есть только пустой методNotifyкоторый, по идее, должен уведомлять объект, что ссылку на него удалили из списка.
Kolan (2006-06-01 12:33:00) [2]Нет с компонентами все автоматом удаляется, не забудешь....
Это как бы мое ИМХО.
Допустим мне нужно, чтобы результат работы ф-ции был объект, скажемTStringList.
Как можно поступить:
1. Пусть сама ф-ция создаст Лист и вернёт его, а удаляет кто-то другой.
Вариант мне не нравится тем, что легко забыть, что надо удалить. А если эта функция написана год назад...
2. Я обычно переделываю функцию в процедуру где передаю созданый объект как параметр. Тогда получается что удаление и создание рядом.:
StringList := TStringLIst.Create;
try
DoSmth(StringList);
finallty
SteingList.Free;
end;
Но это моё мнение я его никому не навязываю...
tesseract (2006-06-01 12:29:00) [3]
> > tesseract © (01.06.06 12:16) [8]Ты эту траву не кури
> - несвежая она
Джулиан Бакнелл с 61. Данная функциональность в нём есть, хотя и не факт что используется.
Сергей М. (2006-06-01 12:27:00) [4]
> Kolan © (01.06.06 12:23) [10]
А вот Борланду, в отличие от тебя, еще как нравится !
У него сплошь и рядом фигурирует TSomeComponent.Create(SomeContainer), и это - фундамент концепции "слежения за объектами".
Kolan (2006-06-01 12:23:00) [5]
> то есть за уничтожением объектов должен следить класс которому
> передают объект/ссылку на объект?
Лично мне такой вариант не нравится. Стараюсь делать так, чтобы кто создал, тот и уничтожал....
Сергей М. (2006-06-01 12:20:00) [6]
> tesseract © (01.06.06 12:16) [8]
Ты эту траву не кури - несвежая она
tesseract (2006-06-01 12:16:00) [7]
> TList объекты не убивает, а только чистит (забывает) ссылки,
только до D5, начиная с неё должен убивать.
evvcom (2006-06-01 12:11:00) [8]
> за уничтожением объектов должен следить
Никто никому ничего не должен. Ты определяешь концепцию для себя, кто и как чего должен, как-то это хоть немного документируешь (хотя бы комментарий перед классом) и строго придерживаешься этой концепции. Сравни TList и TObjectList. Оба списка могут хранить ссылки на объекты, но в TList можно записать абсолютно любые данные (4 байта), а TObjectList заточен под "хранение" объектов, потому и концепция такова. TList объекты не убивает, а только чистит (забывает) ссылки, а TObjectList свои объекты еще и разрушает.
De (2006-06-01 12:00:00) [9]спасибо, ответ получен
Сергей М. (2006-06-01 12:00:00) [10]
> De (01.06.06 11:59) [4]
Не должен, т.е. может, но не обязан.
Все зависит от конкретной логики.
umbra (2006-06-01 11:59:00) [11]
> но возникает вопрос где он должен быть уничтожен?
>
в общем сказать трудно. Один из вариантов - в деструкторе контейнера (myCl2)
De (2006-06-01 11:59:00) [12]то есть за уничтожением объектов должен следить класс которому передают объект/ссылку на объект?
tesseract (2006-06-01 11:58:00) [13]Объект уничтожай после того, как он стал не нужен.И в destroy myCl2 стоить добавить проверку на наличие неуничтоженных объектов.
Сергей М. (2006-06-01 11:57:00) [14]
> где он должен быть уничтожен?
Где угодно.
Например, в одном из методов класса TmyClass2, коль уж скоро ссылка на myCl3 была передана тобой объекту myCl2