![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Интерфейсы. А надо ли их освобождать?
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 копеек. Я "в ручную" освобождаю интерфейсы почти исключительно только тогда, когда этого явно требует логика приложения. Ну, иногда при "глубокой и продолжительной" отладке, именно в отладочных целях.