Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Интерфейсы. А надо ли их освобождать?


Страницы:   1 2 3

DevilDevil ©   (2006-12-04 11:24:00) 

А надо ли освобождать интерфейсы, если они сами автоматически освобождаются, при завершении приложения?


DevilDevil   (2006-12-06 15:14:00) [1]

Всем Thanks!!!


oxffff   (2006-12-06 14:43:00) [2]

Для локальных переменных interface и string

var  a:IUnknown;
     b:string;

код на asm будет

push 0
push 0

А не sub esp,8

Таким образом они всегда инициализированы.


oxffff   (2006-12-06 14:28:00) [3]


>
> DevilDevil ©   (06.12.06 13:23) [38]
>
> > Игорь Шевченко ©   (06.12.06 13:17) [36]
>
>
> Если объявить не интерфейс, а другую переменную, Integer,
>  например, то её изначальное значение может быть любым.
> Ты хочешь сказать, что Delphi сам присваивает интерфейсу
> в конструкторе значение nil. Где можно про это почитать?
>


См. Tobject

-class function InitInstance(Instance: Pointer): TObject;
-procedure CleanupInstance;


Игорь Шевченко   (2006-12-06 13:58:00) [4]

DevilDevil ©   (06.12.06 13:23) [38]


> Ты хочешь сказать, что Delphi сам присваивает интерфейсу
> в конструкторе значение nil. Где можно про это почитать?
>


В справке, разумеется.


DrPass   (2006-12-06 13:44:00) [5]


> допустим я объявил Интерфейс в теле своего класса. Он по-
> идее не должен быть nil, он может содержать что угодно

Поля класса всегда инициализируются пустыми значениями при создании экземпляра класса, если иное явно не задано в конструкции. Ты путаешь с локальными переменными процедур и функций.
Что касается локальной переменной-указателем на интерфейс, то в отличие от того же integer, компилятор тоже для нее сгенерирует код очистки, так что она по умолчанию будет установлена в nil всегда


app   (2006-12-06 13:29:00) [6]


> Integer, например, то её изначальное значение может быть
> любым.

Для Integer это ноль.
Это же базис Дельфи.


saxon   (2006-12-06 13:28:00) [7]


> DevilDevil ©   (06.12.06 13:23) [38]
> Где можно про это почитать?

MSDN, Help, Books ...


Anatoly Podgoretsky   (2006-12-06 13:27:00) [8]

> DevilDevil  (06.12.2006 13:15:35)  [35]

Смеешься?
Все члены класса изначально пустые, для интерфейсов это nil
Срочно в справку и читать основы Дельфи.


DevilDevil   (2006-12-06 13:23:00) [9]


> Игорь Шевченко ©   (06.12.06 13:17) [36]


Если объявить не интерфейс, а другую переменную, Integer, например, то её изначальное значение может быть любым. Ты хочешь сказать, что Delphi сам присваивает интерфейсу в конструкторе значение nil. Где можно про это почитать?


Сергей М.   (2006-12-06 13:18:00) [10]


> Он по-идее не должен быть nil


По идее он как раз nil.


Игорь Шевченко   (2006-12-06 13:17:00) [11]


> допустим я объявил Интерфейс в теле своего класса. Он по-
> идее не должен быть nil


После выполнения конструктора он nil


DevilDevil   (2006-12-06 13:15:00) [12]

Ещё вопрос:

допустим я объявил Интерфейс в теле своего класса. Он по-идее не должен быть nil, он может содержать что угодно. Если я его не использую, а в деструкторе класса пишу := nil, не таит ли это скрытой ошибки?


DrPass   (2006-12-06 13:05:00) [13]


> всё будет хорошо во всех версиях Delphi?

Ты думаешь, разработчики Delphi настолько бестолковые, что, догадавшись сделать неявное освобождение интерфейсов, при этом не догадались в нем проверять значение указателя? Не беспокойся. Если ты посмотришь на ассемблерный код "compiler-magic" функции IntfClear, ты увидишь - это первое, что она делает.


Сергей М.   (2006-12-06 12:31:00) [14]


> DevilDevil ©   (06.12.06 12:26) [32]


> Смысл тот же, что и в одноимённом Си-шном макросе


А в чем тогда смысл С-шного макроса ?

И в чем смысл слепого его копирования ?


DevilDevil   (2006-12-06 12:26:00) [15]


> DrPass ©   (06.12.06 10:11) [30]


Хмм. А если написать:
MyInteface := nil;
MyInteface := nil;
MyInteface := nil;

всё будет хорошо во всех версиях Delphi?


> Сергей М. ©   (06.12.06 09:50) [29]
> Зачем вообще нужна эта "универсальная" процедура ?


Смысл тот же, что и в одноимённом Си-шном макросе


icWasya   (2006-12-06 11:43:00) [16]

а вот ещё
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=759


DrPass   (2006-12-06 10:11:00) [17]


> Зацените, не содержит ли код ошибок:

Во-первых, интерфейс - это и есть указатель,
Во-вторых, достаточно вместо
> if assigned(MyInteface) then MyInteface := nil;


писать MyInteface := nil, и от этого ничего не изменится,
в-третьих, в 99% случаев это вообще можно не писать


Сергей М.   (2006-12-06 09:50:00) [18]


> DevilDevil ©   (06.12.06 09:40) [28]


Не понял..

Зачем эти выкрутасы с косвенными ссылками ?

Зачем вообще нужна эта "универсальная" процедура ?

Приведи пример ее использования ...


DevilDevil   (2006-12-06 09:40:00) [19]

Зацените, не содержит ли код ошибок:

type PInterface = ^IUnknown;

procedure SAFE_RELEASE(I : PInterface);
begin
  if assigned(I^) then I^ := nil;
end;

SAFE_RELEASE(@MyInteface);


Иногда для каждого интерфеса не хочется писать:
if assigned(MyInteface) then MyInteface := nil;

С SAFE_RELEASEкак то проще.

Без указателя (с директивой var) универсальной процедуры (для всех интерфейсов) не получается.


Джо   (2006-12-04 15:13:00) [20]

Сколько мнений! :) Ну, и я свои 5 копеек. Я "в ручную" освобождаю интерфейсы почти исключительно только тогда, когда этого явно требует логика приложения. Ну, иногда при "глубокой и продолжительной" отладке, именно в отладочных целях.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо