7.7 Подсчет ссылок

На верх  Назад  Вперёд

Все COM интерфейсы используют подсчет ссылок. Это означает, что всякий раз, когда интерфейс присваивается переменной, обновляется и счетчик ссылок. Когда переменная выходит из области видимости, счётчик ссылок автоматически уменьшается. Когда счетчик ссылок достигает нуля, экземпляр класса, реализующий интерфейс (как правило), освобождается.

Однако соблюдайте осторожность при использовании этого механизма. Компилятор может создать временную переменную при вычислении выражения, и присвоить ей интерфейс, и только затем присвоить её переменной результата. Не делайте предположений о количестве временных переменных и когда они будут освобождены - это может отличается (и действительно отличается) от того, как другие компиляторы (например Delphi) обрабатывает выражения с интерфейсами. Например, преобразование типа тоже является выражением:

Var
B : AClass;
 
begin
// ...
AInterface(B.Intf).testproc;
// ...
end;

Если интерфейс intf подсчитывает ссылки. То когда компилятор вычисляя B.Intf создает временную переменную. Эта переменная будет освобождена, когда процедура закончит выполнение: поэтому нельзя освобождать экземпляр B до выхода из процедуры, т.к при уничтожении временной переменной, экземпляр B попытается новь освободить память.