Voy a través de algún legado código C++ hacer frente a la biblioteca de Windows Imaging Component y yo observado esto:Pasar un CComPtr a una función con un prototipo puntero prima
void setProperties(IPropertyBag2* const pBag)
{
pBag->Write(...);
}
void other_function()
{
CComPtr<IPropertyBag2> pBag;
//Code to initialize pBag
setProperties(pBag);
}
El método setProperties
simplemente escribe un montón de propiedades a la bolsa de propiedades. El código se compila y funciona bien porque creo que llama al operador de tipografía correspondiente.
Mi pregunta es si se recomienda tal interfaz o si hay una mejor manera de pasar el puntero. Por ejemplo, ¿hay alguna diferencia (en términos de seguridad/rendimiento) si la firma se cambió a:
void setProperties(const CComPtr<IPropertyBag2>& pBag)
El uso de un parámetro CComPtr no lo vinculará a utilizar CComPtr siempre, porque los constructores CComPtr no son explícitos. Y los punteros de interfaz en bruto no son punteros inteligentes. Olvidarse de liberar un objeto hará que se filtre. Tiene todos los mismos problemas que olvidarse de 'borrar' la memoria asignada con' nuevo'. – user1610015