Direct3D основан на COM, технологии, которой не менее 15 лет.Похоже, многие утверждают, что COM мертв, и по этой причине многие упускают его из виду, но реальность такова, что в Windows есть много вещей, включая Direct3D и новый Media Foundation MS, которые основаны на COM.
Я настоятельно рекомендую вам принятьвзгляд на общее программирование COM.Есть много книг и ресурсов, но многие из них довольно старые, но это нормально, потому что корень технологии не менялся в течение очень долгого времени.
В основном вы наблюдали подсчет ссылок на интерфейс,COM основан исключительно на доступе к объектам через интерфейсы, которые все происходят из базового интерфейса, IUnknown.IUnknown реализует методы AddRef () и Release (), и ваше приложение должно вызывать AddRef () всякий раз, когда вы сохраняете локальную копию указателя, и вызывать Release () всякий раз, когда эта локальная копия больше не нужна.
Если у вас есть методы с параметрами интерфейса out (например, IFoo ** ppObj), это означает, что вызываемый абонент возвращает вам интерфейс, и теперь, когда у вас есть его, вы все равно обязаны вызывать Release (), когда вы закончите.с ним.
Как только вы освоите его, я бы предложил вам начать использовать умный класс CComPtr для хранения локальных переменных и переменных-членов (по-прежнему передавать необработанные значения интерфейса между вызовами функций, нет необходимости в типах параметров интеллектуального указателя)).Он позаботится о подсчете всех ваших ссылок.Также не практикуйте называние релиза «любым числом» раз.Это может сработать сегодня, потому что объект реализован как одноэлементный, или, возможно, что-то еще удерживает его, но это может измениться со следующим патчем или следующим выпуском.Всегда следуйте правилам.Если у вас есть интерфейс, когда он вам не нужен, вызывайте Release () ровно один раз.Если вы сделали копию указателя интерфейса, обязательно вызовите AddRef () ровно один раз.