среда, апреля 15, 2009

Очередные ошибки инициализации/финализации в Delphi 2006 - 2009

Отчет #73008 описывает несвоевременную финализцию энумератора являющегося интерфейсом при использовании в основном теле программы (в процедурах и функциях работает нормально), что в некоторых случаях может приводить к ошибкам доступа (Access violation).

Отчет #73009 описывает неадекватную инициализацию (а точнее ее отсутствие) интерфейсного поля advanced record в случае, когда последняя используется в качестве возвращаемого значения.

5 комментариев:

Aleksey комментирует...

Извини, что не в тему, но мне интересно мнение профессионала по поводу одной идеи. Взгляни пожалуйста, если будет свободное время.
Вкратце, это предложениe для расширения VCL, которое, имхо Borland-у стоило бы реализовать уже давно. Но недавно я оформил suggestion, написал пост и оформил report в QC. Теперь ношусь с ним как дурень с писаной торбой. =)

О введении интерфейсов для всех базовых классов VCL.

Kazantsev Alexey комментирует...

Я не смог у тебя комментарий оставить :( Видимо дело в моей Опере... Пишу тут.

Вообще, унификация всего и вся, это конечно хорошо ;), но думаю, этого не произойдет, и тому есть несколько причин. Как только мы получили интерфейс от объекта, объект получил управляемое время жизни (!). А если автор на это не расчитывал (речь ведь идет не только о наследниках компонентов. Или нужно менять объектную модель)? Другая причина состоит в том, что, как-то нужно координироваться разработчикам библиотечных классов для обеспечения подобной унификации, что на мой взгляд просто не реально (мне [абстрактно] не интересно, чтоб мои контролы аля TKAButton легко заменили на TTAButton и перестали платить за новые версии).

Алексей Тимохин комментирует...

Спасибо за ответ. =))

Я на самом деле сам не верю, что подобное 1-в-1 будет реализовано. Но может какие-то шаги в этом направлении всё-таки будут сделаны.

Я пока не могу сообразить, в каких случаях управляемое время жизни (!) вызовет проблемы.=(

А насчёт поддержки авторами компонент. Я думаю, что если бы интерфейс типа IButton поддерживался стандартными классами VCL, и реально использовался бы программистами, то разработчикам сторонних компоненнт пришлось бы реализовать поддержку у себя.

Кстати, подобная реализация, теоретически позволила бы и привлечь новых пользователей за счёт упрощения миграции.=)

Kazantsev Alexey комментирует...

>в каких случаях управляемое время жизни (!) вызовет проблемы

//
Procedure AnyProc(AObject : TObject);
Var

IntfList : IInterfaceList;

Begin

If AObject.GetInterface(IInterfaceList, IntfList) Then
// произошла смена управления временем жизни
WriteLn(IntToStr(IntfList.Count));

End;
//

Var

List : TInterfaceList;

...

List := TInterfaceList.Create;
Try

AnyProc(List);

// тут объекта уже нет

Finally

List.Free;

End;

Алексей Тимохин комментирует...

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