 |  | |  | |
ПРОГРАММИСТ.Интерфейсный объект не всегда освобождается сам | Полный текст материала
Цитата или краткий комментарий: «... Подобный вызов SomeProc будет приводить к утечке памяти, если A передаётся как Const или не используется в SomeProc.
...» |
Важно:- Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
- Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
- Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.
Добавить свое мнение.
[TInterfacedObject] [Жизненный цикл]
Отслеживать это обсуждение 
Всего сообщений: 302-08-2002 10:56Это не совсем ошибка, скорее непродуманная возможность. Смотрите сами, вариант:
SomeProc(TInterfacedObject.Create);
вызывает утечки памяти, а вариант
var
io: IUnknown;
. . .
io := TInterfacedObject2.Create();
SomeProc(io);
работает корректно. Хотя ни там, ни там явного приведения типа 'as' не испольуется. В обоих случаях идёт присвоение переменной типа IUnknown. Вся разница в том, что в кривом варианте, переменная -- параметр функции, а в работающем -- локальная переменная.
Ну не бред ли? Можете сказать, что тут const влияет, но память утекает, если даже убрать const и просто не использовать в теле SomeProc переданный параметр.
В help есть хороший пример на эту тему, найдите статью под названием 'Using reference counting'. Там использовано оч-чень точное слово: 'surprise...' |
|
29-07-2002 15:48Вообще-то, при описанных условиях (ссылка не используется в процедуре) экземпляр не уничтожается (проверяется перекрытием деструктора и установкой точки останова) как при наличии const, так и без оного.
Согласен с мнением Сергея Заборовца. Приведенный автором случай -- пример недостаточного понимания недостаточно документированной особенности компилятора (автоматическое приведение объекта к интерфейсу).
Правильный вызов
SomeProc(TInterfacedObject.Create as IUnknown);
гарантирует правильный подсчет ссылок в полном соответствии со спецификацией языка и компилятора. |
|
26-07-2002 18:40Я бы не назвал это ошибкой компилятора
Так как класс создается с RefCount=0 а передача интерфейса как
Const не приводит к вызовам _AddRef и _Release.
В результате получаем что класс никто не уничтожает.
Скорее всего этот пример надо перенести в раздел 'Програмист'. |
|
|
|