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