Невозможно использовать типы обертки RAII для COM-объектов. В частности, не используется CComPtr<>
, CComBSTR
и CComVARIANT<>
. Эти объекты help предотвращают утечку, удаляя ответственность за освобождение базового ресурса от разработчика. Объект wrapper принудительно освобождает ресурсы в своем деструкторе.
Другая причина утечек или случайных ошибок, которые я видел, является результатом неявного преобразования от CComPtr<T>
до T*
. Это полезно для передачи обернутых объектов в качестве аргументов. Но это может вызвать проблемы, потому что это допускает неявное преобразование между объектом RAII и необработанным указателем. Например
CComPtr<IFoo> GetAFoo(); // Imagine if this creates the object
...
IFoo* pFoo = GetAFoo();
pFoo->SomeCall();
Вызов SomeCall, скорее всего, не в состоянии в этом случае, так как объект pFoo умер в этой точке. Зачем? Значение было возвращено с помощью ref count 1 из GetAFoo, назначенного pFoo, а затем уменьшилось до 0 и удалено, поскольку временное значение выпало из области видимости.