![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Существует ли экземпляр класса
Gydvin © (2007-12-27 14:08:00)Имеется потенциально "опасный" участок кода. В котором создаются и высвобождаются экземпляры разнообразных классов. Заключил все это дело в обертку try..except. Теперь же хочу в случае исключения прибить "живые" экземпляры. Как можно проверить, какие из них еще живы?
Anatoly Podgoretsky (2007-12-27 22:26:00) [1]> oxffff (27.12.2007 20:11:17) [17]
Процессору тоже надо чем то заниматься.
oxffff (2007-12-27 20:11:00) [2]
> clickmaker © (27.12.07 14:11) [1]
> var SomeInstance: TSomeClass;
>
> ...
> SomeInstance := nil;
>
> ...
> try
> ...
>
> except
> if (SomeInstance <> nil) then SomeInstance.Free;
> end;
А if зачем ?
:)
Anatoly Podgoretsky (2007-12-27 17:32:00) [3]> Gydvin (27.12.2007 14:34:06) [6]
Какая разница, все равно контролируй с помощью try
han_malign (2007-12-27 15:07:00) [4]FreeAndNil
Gydvin (2007-12-27 14:55:00) [5]понятно. спасибо
Сергей М. (2007-12-27 14:53:00) [6]
> На самом деле работа ведется со стримами и еще ко с чем
А по барабану с чем "ведется работа".
Распределил ресурс ?
Изволь контролировать его состояние на всем протяжении его "жизни".
А не можешь контролировать - дорога одна: индивидуальный try..finally для каждого из таких ресурсов.
Palladin (2007-12-27 14:51:00) [7]
> чего бы нехотелось...
если не хочешь ждать, пиши кучу try finally на каждый объект
Gydvin (2007-12-27 14:48:00) [8]в этом случае с высвобождением ненужных объектов придется подождать до конца выполнения функции, чего бы нехотелось...
А придеться ждать?
Palladin (2007-12-27 14:41:00) [9]и что?
ну инициализируй всю твою кучу объектов в Nil перед работой "потенциально опасного" участка кода да оберни всю фкнкцию в try finally
и в секции finally вызови у всех free, в чем проблемма то?
Gydvin (2007-12-27 14:39:00) [10]короче говоря все это от того, что я нехочу на каждый объект ставить обработчик исключений. А хочу поставить один на всю функцию. Соответсвенно прибить в случае чего, все что там есть.
Palladin (2007-12-27 14:34:00) [11]ну мля, если bitmap все равно должен в конце концов освободится, на кой писать вызов Free в секции except если сверху нам дано finally
bitmap:=tbitmap.create;
try
.. вселенская катастрофа ..
finally
//что бы ни случилось во время оной, объект все равно уничтожится
bitmap.Free;
end;
clickmaker (2007-12-27 14:34:00) [12]еще лучше
try
finally
bitmap.Free;
end;
собссно, не пойму, в чем все-таки проблема?
Gydvin (2007-12-27 14:34:00) [13]Это - то я понимаю, и тбитмап привел ради примера. На самом деле работа ведется со стримами и еще ко с чем. А так как количество потоков, заранее неизвестно, то я просто хотел с экономить ресурсы и создавать и высвобождать объекты по мере надобности.
Сергей М. (2007-12-27 14:29:00) [14]
> Gydvin © (27.12.07 14:26) [3]
Криво делаешь - кривой и результат.
bitmap:=tbitmap.create;
try
.. вселенская катастрофа ..
except
//что бы ни случилось во время оной, сначала уничтожим объект
bitmap.Free;
raise;
end;
Gydvin (2007-12-27 14:27:00) [15]
> Что, сами по себе ?Тебе разве эти "процессы" не подконтрольны
> ?
да не, подконтрольны. просто берегусь
Gydvin (2007-12-27 14:26:00) [16]чесно говоря не въехал (
допустим так
var bitmap:tbitmap;
....
try
.....
bitmap:=tbitmap.create;
... //где-нить здесь ловим исключени и вываливаемся в except
bitmap.free;
....
except
///как узнать живой ли еще bitmap?
end;
просто классов используется несколько разных и некоторые из них могут вызвать исключение, например по доступу к файлу, доступ ведется из нескольких потоков. И может возникнуть ситуация, когда один поток захочет прочитать файло в момент записи из другого.
Сергей М. (2007-12-27 14:21:00) [17]
> создаются и высвобождаются экземпляры разнообразных классов
Что, сами по себе ?
Тебе разве эти "процессы" не подконтрольны ?
clickmaker (2007-12-27 14:11:00) [18]var SomeInstance: TSomeClass;
...
SomeInstance := nil;
...
try
...
except
if (SomeInstance <> nil) then SomeInstance.Free;
end;