![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли объекту уничтожить самого себя ? [D7, XP]
b/@. © (2009-06-04 16:12:00)К примеру есть форма, которая должна создаваться, а по событию от таймера уничтожаться:
TfrmInfo = class(TForm)
Timer: TTimer;
...
procedure T_Splash.FormCreate(Sender: TObject);
begin
// выделяются ресурсы
...
Timer.Enabled := true;
end;
procedure TfrmInfo.FormDestroy(Sender: TObject);
begin
// тут уничтожаются выделенные ресурсы
end;
procedure TfrmInfo.TimerTimer(Sender: TObject);
begin
Free();
end;
Корректно ли так уничтожать форму ?
b/@. (2009-06-09 15:39:00) [1]
> Игорь Шевченко © (09.06.09 12:03) [33]
Когда переходил с бейсика на паскаль то ужасало, что нужно описывать каждую переменную, а то что их еще и инициализировать нужно казалось вообще кошмаром...
Игорь Шевченко (2009-06-09 12:03:00) [2]b/@. © (09.06.09 11:44) [27]
> Ведь во всех книжках по паскалю пишут что любая переменная
> должна быть явно инициализирована...
а среда, когда генерирует переменную, не инициализирует ее. Наверное там тех книжек не читали :)
Ins (2009-06-09 12:02:00) [3]
> Может будет, а может и нет, если сильно повезёт.
Нет. Не будет фигни гарантированно. Я в [23] все описал. String - это финализируемый тип. (Если конечно речь о Delphi, а не о Паскале)
Ins (2009-06-09 12:00:00) [4]
> каким образом можно уничтожать изнутри ?
Если гарантируешь, что после этого момента не будет никакого обращения к уничтоженному экземпляру, то можно просто Free. Обращение к экземпляру - это обращение к полям, вызов виртуальных, динамических методов. Вызвать статический метод, который внутри себя к Self не обращается, можно даже с уничтоженным объектом. Ну, а если не гарантируешь, то несколько сложнее, но тоже можно.
Ega23 (2009-06-09 11:56:00) [5]Кое-что можно опустить, например инициализацию полей в объекте, там изначально FillChar(0) идёт. Т.е. все указатели - nil, числа - 0, Bool - False и т.п.
А вот уже тут:
function Foo() : string;
var
s : string;
i : Integer;
begin
for i:=155 to 160 do
s := ss + Chr(i);
Result := s;
end;
возможнобудет фигня полная.
Может будет, а может и нет, если сильно повезёт.
b/@. (2009-06-09 11:54:00) [6]А объекты других типов, которые наследованы не от
TCustomFormа от других классов каким образом можно уничтожать изнутри ?
И даже те у которых нету обработчиков событий ?
Ega23 (2009-06-09 11:52:00) [7]
> Ведь во всех книжках по паскалю пишут что любая переменная
> должна быть явно инициализирована...
Правильно пишут.
b/@. (2009-06-09 11:44:00) [8]
var
FInfo: TfrmInfo = nil;
Это я написал без умысла, просто не знал что можно забить на это и не инициализировать :(
Ведь во всех книжках по паскалю пишут что любая переменная должна быть явно инициализирована...
Rouse_ (2009-06-05 19:09:00) [9]
> Много ли паскалевидных компайлеров имеющих представления
> о TForm.FormDestroy ?
Это был ответ на вопрос, о физическом смысле присвоения, а не подача для начала дискуссии о компиляторах :)
ANB (2009-06-05 13:25:00) [10]
> иногда выдает. когда какой-нибудь правоверный инициализирует,
> а 20-ю строчками кода ниже присваивает значение.
А нафига 2 раза инициализить ? Правильно выдает.
Игорь Шевченко (2009-06-05 12:25:00) [11]
> Кстати, хинта на начальное присвоение компилятор не выдает
иногда выдает. когда какой-нибудь правоверный инициализирует, а 20-ю строчками кода ниже присваивает значение.
Ins (2009-06-05 12:18:00) [12]
> Инициализяться точно поля объектов. Насчет локальных переменных
> я бы так строго не утверждал, так как, не буду утверждать
> точно, но кажись нарывался на редко проявляемую ошибку с
> мусором в неинициализенной явно переменной.
Инициализируются:
- Глобальные переменные (размещены сегменте данных исполняемого модуля, куда компилятор записывает нужные значения), за исключением тех случаев, когда оптимизатор делает их локальными.
- Поля объектов (инициализируются в TObject.InitInstance)
- Локальные переменные финализируемых типов - длинные строки, динмассивы, интерфейсы, варианты (компилятор специально для них вставляет код инициализации)
Не инициализируются:
- Локальные переменные типов, не перечисленных выше. Содержат содержащийся в стеке мусор
ANB (2009-06-05 12:01:00) [13]
> Сам же себе и противоречишь.
> Не было бы фичей, больше бы было шишек, и больше бы читали
> хелп. Иначе откуда бы знали, что (и как, и когда) иницализируется,
> а что нет.
> :)
Инициализить переменные в коде - правила хорошего тона. Если компилятор сам их инициализит - - вот пусть его оптимизатор "ненужный" код сам и выкидывает.
Кстати, хинта на начальное присвоение компилятор не выдает. А если его забыть - вполне можно огрести предупреждение.
Инициализяться точно поля объектов. Насчет локальных переменных я бы так строго не утверждал, так как, не буду утверждать точно, но кажись нарывался на редко проявляемую ошибку с мусором в неинициализенной явно переменной.
Ega23 (2009-06-05 10:22:00) [14]
> Это понятно, для чего выносить в отдельную процедуру (функцию)
> тривиальный код?
Паттерн "Синглтон".
Германн (2009-06-05 01:58:00) [15]
> Фичи тут абсолютно не причем.
>
> С другой стороны, знаю, что локальные строковые переменные
> инициализируются пустой строкой, а все равно, если надо
> что-то накапливать, сначала строку инициализирую пустой
> :)
Сам же себе и противоречишь.
Не было бы фичей, больше бы было шишек, и больше бы читали хелп. Иначе откуда бы знали, что (и как, и когда) иницализируется, а что нет.
:)
Может я не правильно употребил термин "фича"?
Игорь Шевченко (2009-06-05 01:40:00) [16]@!!ex © (05.06.09 00:39) [16]
> Это хорошая привычка. ИМХО.
Хорошая привычка - знать инструмент, с которым работаешь. Это даже не ИМХО.
> Но большинство не знает.
Проблемы индейцев шерифа не волнуют :)
Германн © (05.06.09 01:31) [18]
> А я так вообще почти в первый раз.
Я не в первый, но каждый разу удивляюсь, и когда есть возможность спросить - спрашиваю. Ответы получаю самые разные.
Фичи тут абсолютно не причем.
С другой стороны, знаю, что локальные строковые переменные инициализируются пустой строкой, а все равно, если надо что-то накапливать, сначала строку инициализирую пустой :)
Ну вот код мне такой понятнее.
Германн (2009-06-05 01:31:00) [17]
> Игорь Шевченко © (04.06.09 18:40) [13]
>
>
> > var
> > FInfo: TfrmInfo = nil;
>
>
> кстати - это имеет какой-то физический смысл (присваивание)
> ? А то я не первый раз встречаю.
>
А я так вообще почти в первый раз. "Новомодные фичи" непонятно для чего сделанные.
Таких в Дельфи, на мой скус слишком много.
Германн (2009-06-05 01:26:00) [18]
> меньше шишокбыло бы...
А это что за звери?
:)
@!!ex (2009-06-05 00:39:00) [19]> [13] Игорь Шевченко © (04.06.09 18:40)
> кстати - это имеет какой-то физический смысл (присваивание)
> ? А то я не первый раз встречаю.
Это хорошая привычка. ИМХО.
Лет 5 назад по своей неопытности и наивному предположению(все инициализируется 0) получил критическую ошибку в C++ проекте.
Понятно, что если знать, то этой проблемы легко избежать. Но большинство не знает.
Сейчас я вполне четко осознаю что будет с переменными в С++ или в дельфи и пишу соответствующе. Но это опыт и швабры.
Не полагался бы на компилятор изнчально - меньше шишок было бы...
Игорь Шевченко (2009-06-04 23:46:00) [20]Rouse_ © (04.06.09 23:10) [14]
Много ли паскалевидных компайлеров имеющих представления о TForm.FormDestroy ?
Lazarus и FreePascal переменные инициализует также, как Delphi