Advertencia C6221
Conversión implícita entre tipos enteros semánticamente diferentes: comparando HRESULT con un entero. Considere la posibilidad de usar
SUCCEEDED
oFAILED
macros en su lugar
Esta advertencia indica que un tipo HRESULT
se está comparando con un entero distinto de cero.
Un éxito en una HRESULT
(S_OK
) se representa mediante un 0. Por lo tanto, una conversión implícita de a HRESULT
un entero genera un valor incorrecto y es probable que provoque el resultado incorrecto. El error suele deberse a la espera errónea de que una función devuelva un entero cuando realmente devuelve un HRESULT
.
Nombre de análisis de código: COMPARING_HRESULT_TO_INT
El código siguiente genera la advertencia C6221 comparando un HRESULT
objeto con un valor entero:
#include <windows.h>
HRESULT f( )
{
HRESULT hr;
LPMALLOC pMalloc;
hr = CoGetMalloc(1, &pMalloc);
if (hr == 4)
{
// failure code ...
return S_FALSE;
}
else
{
// success code ...
return S_OK;
}
}
Para corregir esta advertencia, el código siguiente usa la macro FAILED
:
#include <windows.h>
HRESULT f( )
{
HRESULT hr;
LPMALLOC pMalloc;
hr = CoGetMalloc(1, &pMalloc);
if (FAILED(hr))
{
// failure code ...
return S_FALSE;
}
else
{
// success code ...
return S_OK;
}
}
Para esta advertencia, el tipo SCODE
es equivalente a HRESULT
.
Para obtener más información, vea SUCCEEDED
Macro y FAILED
Macro.
El uso de malloc
y free
(y las API de asignación dinámica de memoria relacionadas) tiene muchos problemas en términos de pérdidas de memoria y excepciones. Para evitar estos tipos de posibles fugas por completo, use los mecanismos proporcionados por la biblioteca estándar de C++ (STL). Entre ellos se incluyen shared_ptr
los contenedores , unique_ptr
y , como vector
. Para más información, consulte los artículos sobre punteros inteligentes y la biblioteca estándar de C++.