Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.12.24;
Скачать: [xml.tar.bz2];

Вниз

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

 
DevilDevil ©   (2006-12-04 11:24) [0]

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


 
Сергей М. ©   (2006-12-04 11:26) [1]


> надо ли освобождать интерфейсы


В общем случае - да, надо.
В частном случае - смотря что за случай...


 
DevilDevil ©   (2006-12-04 11:42) [2]

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


 
Сергей М. ©   (2006-12-04 11:44) [3]


> если он всё равно по завершению приложения освободится?


Завершение завершению рознь.

Halt - это тоже завершение. Аварийное.
_Release при этом вызван не будет


 
umbra ©   (2006-12-04 11:51) [4]

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


 
DevilDevil ©   (2006-12-04 12:01) [5]

> _Release при этом вызван не будет

Сергей, скажите (просто интересно), а Вы чтобы интерфейс освободить, что делаете?


> они сами автоматически освобождаются, при неаварийном завершении
> приложения


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

Поэтому, при любом завершении приложения они по идее должны освобождаться. Я не прав?


 
Kolan ©   (2006-12-04 12:03) [6]

Короче, непрарься ничего освобождать ненадо.


 
Сергей М. ©   (2006-12-04 12:06) [7]


> DevilDevil ©   (04.12.06 12:01) [5]


Зависит от самого интерфейса и контекста его использования.
Но предпочитаю явное освобождение - это наглядней, проще для понимания общей логики и немало способствует упрощению отладки приложения.


 
Kolan ©   (2006-12-04 12:10) [8]

> Но предпочитаю явное освобождение - это наглядней, проще
> для понимания общей логики и немало способствует упрощению
> отладки приложения.

Зачем такое надо? Я напротив использую интерфейс когда объект передается в разные методы и непонятно где уничтожать его. Все само удалится...


 
umbra ©   (2006-12-04 12:10) [9]

по определению они освобождаются, когда их счетчик ссылок становится равным нулю. Чтобы он стал равным нулю, каждый клиент должен вызвать метод _Release интерфейса IUnknown. Если по каким-то причинам этот метод не вызван, счетчик не обнулится и интерфейс не освободится. Явным образом вызвать этот метод можно присвоив переменной интефейсного типа nil.


 
DrPass ©   (2006-12-04 12:11) [10]


> В общем случае - да, надо.

В общем случае как раз не надо. Delphi всегда генерирует для интерфейсов вызов _Release при выходе соотв. переменной за пределы области видимости. Надо в том случае, если СОМ-объект требует дополнительных операции для деинициализации. Ну или если логика работы приложения требует. А явное освобождение "просто так" делать не стоит. Это все равно что делать присваивание два раза подряд - чтобы уж наверняка :)


 
Kolan ©   (2006-12-04 12:12) [11]

Автору:
when an object is referenced only through interfaces, there is no need to destroy it manually; the object is automatically destroyed when the last reference to it goes out of scope.


 
Сергей М. ©   (2006-12-04 12:19) [12]


> DrPass ©   (04.12.06 12:11) [10]


Хорошо, поменяем в [1] общий случай и частный случай.
Принципиально это ничего не меняет - все равно нужно уточнять контекст, прежде чем принимать решение.


> Kolan ©   (04.12.06 12:10) [8]


Что "зачем надо" ? Упрощать отладку что ли ?)


 
Anatoly Podgoretsky ©   (2006-12-04 12:23) [13]

> Сергей М.  (04.12.2006 12:06:07)  [7]

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


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


> Anatoly Podgoretsky ©   (04.12.06 12:23) [13]


Да, приводит. Если нет четкого понимания, где, что, почему, как и при каких условиях происходит в ходе явного освобождения)

У меня не то что "многочисленных" - вообще никаких ошибок не происходит при этом.

Что я не так делаю ?)

Только не надо уже про "делать присваивание два раза подряд - чтобы уж наверняка", мне прекрасно известны действия компилятора при том или ином "варианте освобождения")


 
Anatoly Podgoretsky ©   (2006-12-04 12:32) [15]

> umbra  (04.12.2006 12:10:09)  [9]

Это по каким причинам Дельфи не уменьшит счетчик ссылок при выходе из области видимости. При условии, что шаловливые ручки не применялись?


 
Anatoly Podgoretsky ©   (2006-12-04 12:33) [16]

> DrPass  (04.12.2006 12:11:10)  [10]

И чистить переменную три раза, что совсем очистить.


 
oxffff ©   (2006-12-04 12:47) [17]


> Anatoly Podgoretsky ©   (04.12.06 12:23) [13]
> > Сергей М.  (04.12.2006 12:06:07)  [7]
>
> Если ты про интерфейсы, используемые в Дельфи, то явное
> особождение приводит к многочисленным ошибкам.


многочисленным ошибкам?
Приведите пример пожалуйста.

Ошибки возможны, если вместо

1. a:=nil
2  intFclear(a);
3  a._Release;pointer(a):=nil;

Использовать a._Release,

А явное освобождение надежнее. поскольку можно обернуть в  
      try
      finally
      end;

Да и лучше избегать временных(не объявленных) интерфейсных переменных,
поскольку их в try
                     finally
                     end;

Нормальными средствами не обернешь.


 
Anatoly Podgoretsky ©   (2006-12-04 13:02) [18]

> oxffff  (04.12.2006 12:47:17)  [17]

Вот видишь, сколько ты условий насчитал, а ведь даже малой части не перечислил.


 
oxffff ©   (2006-12-04 13:07) [19]


> Anatoly Podgoretsky ©   (04.12.06 13:02) [18]
> > oxffff  (04.12.2006 12:47:17)  [17]
>
> Вот видишь, сколько ты условий насчитал, а ведь даже малой
> части не перечислил.


Так вы поясните свою точку зрения.


 
DevilDevil ©   (2006-12-04 13:12) [20]


> Anatoly Podgoretsky ©   (04.12.06 12:23) [13]


Анатолий, при всём уважении... Явным особождением в Delphi считается присвоение nil, которое в свою очередь ни к каким ошибкам не приводит


 
Anatoly Podgoretsky ©   (2006-12-04 13:43) [21]

> oxffff  (04.12.2006 13:07:19)  [19]

Я ее озвучил выше


 
Anatoly Podgoretsky ©   (2006-12-04 13:44) [22]

> DevilDevil  (04.12.2006 13:12:20)  [20]

Мало ли, что считается?
Во первых это не явное, а явное _Release и его тоже используют, но часто без необходимости, просто слышали, что это круто.


 
oxffff ©   (2006-12-04 13:50) [23]

Опять все правы. И это хорошо.


 
DevilDevil ©   (2006-12-04 13:56) [24]


> Anatoly Podgoretsky ©   (04.12.06 13:44) [22]


Анатолий, при всём уважении, настаиваю на "использовать _Release в Delphi крайне не рекомендуется". Можно даже сказать "запрещено"


 
Сергей М. ©   (2006-12-04 14:03) [25]


> настаиваю на "использовать _Release в Delphi крайне не рекомендуется".
>  Можно даже сказать "запрещено"


Да глупости же !


 
Anatoly Podgoretsky ©   (2006-12-04 14:54) [26]

> oxffff  (04.12.2006 13:50:23)  [23]

> Опять все правы.

Консенсунс есть продукт непротивления сторон.


 
Джо ©   (2006-12-04 15:13) [27]

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


 
DevilDevil ©   (2006-12-06 09:40) [28]

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

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-06 09:50) [29]


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


Не понял..

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

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

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


 
DrPass ©   (2006-12-06 10:11) [30]


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

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


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


 
icWasya ©   (2006-12-06 11:43) [31]

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


 
DevilDevil ©   (2006-12-06 12:26) [32]


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


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

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


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


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


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


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


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


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

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


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


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

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


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

Ещё вопрос:

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


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


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


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


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


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


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


 
DevilDevil ©   (2006-12-06 13:23) [38]


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


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


 
Anatoly Podgoretsky ©   (2006-12-06 13:27) [39]

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

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


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


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

MSDN, Help, Books ...


 
app ©   (2006-12-06 13:29) [41]


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

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


 
DrPass ©   (2006-12-06 13:44) [42]


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

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


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

DevilDevil ©   (06.12.06 13:23) [38]


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


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


 
oxffff ©   (2006-12-06 14:28) [44]


>
> 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;


 
oxffff ©   (2006-12-06 14:43) [45]

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

var  a:IUnknown;
     b:string;

код на asm будет

push 0
push 0

А не sub esp,8

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


 
DevilDevil ©   (2006-12-06 15:14) [46]

Всем Thanks!!!



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.12.24;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.57 MB
Время: 0.04 c
15-1164984386
grisme
2006-12-01 17:46
2006.12.24
UTF-8


3-1160811546
БогданБ
2006-10-14 11:39
2006.12.24
Как можно возвращать ScrolBar?


2-1165144894
Tru
2006-12-03 14:21
2006.12.24
просмотр данных


15-1165070881
dzmitry[li]
2006-12-02 17:48
2006.12.24
Пульт ДУ для компьютера


2-1165083215
Mozgan
2006-12-02 21:13
2006.12.24
Как узнать имя?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский