TA = class(TInterfacedObject) procedure Subscribe(aList : TList); end; TB = class(TB, IUnknown) procedure UnSubscribe(aList : TList); end; procedure TA.Subscribe(aList : TList); begin aList.Add(Pointer(IUnknown(Self))); // - кладём один указатель end; procedure TB.UnSubscribe(aList : TList); begin aList.Remove(Pointer(IUnknown(Self))); // - пытаемся удалить - другой указатель, в итоге - не удаляем и получаем провисшую ссылку, а позже - огребаем AV end;
-- понятно, что рафинированный пример крив и надуман. Но я встречался с подобным в жизни. Коллеги не дадут соврать. А пример лишь призван проиллюстрировать это.
Имейте эту проблему - в виду. Особенно когда у вас IUnknown "где-то в листах "залип"".
Комментариев нет:
Отправить комментарий