Почему за вызовом QueryInterface всегда следует вызов Release?
Поскольку QueryInterface будет вызывать AddRef , что увеличивает количество ссылокк указателю.Когда имеется 0 ссылок на указатель, он освобождается для вас.
Примечание. В ответах на этот вопрос возникает некоторая путаница относительно того, что на самом деле делает QueryInterface
.Он просто извлекает указатели на поддерживаемые интерфейсы объекта и увеличивает счетчик ссылок на этот объект.Он не создает новый объект для каждого реализуемого интерфейса.
Например, если у вас есть объект, который реализует 2 интерфейса, то вызов просто приведёт этот объект к каждому интерфейсу и увеличит переменнуюкоторый используется в качестве счетчика ссылок.
Примечание: счетчик ссылок может быть реализован различными способами, но вышеизложенное объясняет обычный сценарий.В частности, @Ben описывает отрывной интерфейс, ниже которого подчеркивается важность вызова Release для указателя интерфейса, который был вам возвращен.