2015-10-11 4 views
0

ли СОМ-интерфейс должны переопределить AddRef и Release, если он владеет другими интерфейсами?COM владение композицией в интерфейсах

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

Но что AddRef? Кажется, все будет хорошо, когда вы будете делать мелкие копии принадлежащих интерфейсов. Они могут быть пересчитаны ниже владения интерфейсом, но никогда не могут достигнуть нуля, когда владелец не достигнет нуля.

Примером этого сценария является IDirect3DTexture9, владеющий множеством IDirect3DSurface9 для каждого уровня текстуры.

+2

Что вы имеете в виду под «собственным» здесь? Когда вызывающий абонент получает указатель на интерфейс (используя любой метод, QueryInterface или другие), AddRef был создан методом calllele. Когда вызывающему абоненту больше не нужен указатель интерфейса, он вызывает Release. Это все о COM. Вызывающий не использует значения возвращаемого значения AddRef или Release. –

+0

@SimonMourier В моем примере есть дочерние/управляемые интерфейсы, созданные при создании родителя/владельца. Если вызывающий абонент просто освобождает созданный интерфейс, дочерние/принадлежащие ему интерфейсы также должны быть освобождены. – typ1232

+0

Это зависит от дизайнерского решения автора библиотеки. Иногда «родитель» владеет (addrefs) потом ребенком «дочерний» addrefs родительский, иногда и тот, и другой. – Ben

ответ

0

No.

ресурсы должны быть освобождены в деструкторе, или автоматически, если вы используете смарт-поля указателя. Я предполагаю, что вы используете C++.

Таким образом, в самом деле, внутренние указатели на интерфейсы могут иметь более низкую счетчик ссылок, чем наружный указатель интерфейса.

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