Partager via


C6226

Avertissement C6226 : cast implicite entre types d'entiers sémantiquement différents : assignation de -1 à HRESULT.Si possible, utilisez E_FAIL à la place.

Cet avertissement indique qu'un HRESULT est assigné ou initialisé avec une valeur d'un explicite -1.Cet avertissement est fréquemment généré par confusion accidentelle entre les types entier et HRESULT.Pour indiquer le succès, la constante symbolique S_OK doit être utilisée.Pour indiquer l'échec, les constantes symboliques qui commencent par E_constant doivent être utilisées.

Pour plus d'informations voir les macros SUCCEEDED et FAILED.

Exemple

Le code suivant génère cet avertissement :

#include <windows.h>

VOID f( )
{
  HRESULT hr;
  LPMALLOC pMalloc;
  
  if (FAILED(CoGetMalloc(1, &pMalloc)))
  {
    hr = -1;
    // code ...
  }
  else
  {
    // code ...
  }
}

Pour corriger cet avertissement, utilisez le code suivant :

#include <windows.h>

VOID f( )
{
  HRESULT hr;
  LPMALLOC pMalloc;
  
  if (FAILED(CoGetMalloc(1, &pMalloc)))
  {
    hr = E_FAIL;
    // code ...
  }
  else
  {
    // code ...
  }
}

Pour cet avertissement, le type SCODE équivaut à HRESULT.

Notez que l'utilisation de malloc et free (et des API connexes d'allocation mémoire dynamique) présente de nombreux pièges en termes de fuites de mémoire et d'exceptions.Pour éviter complètement ce genre de problème de fuites et d'exception, utilisez les mécanismes fournis par la bibliothèque de modèles standard (STL) C++.Ceux-ci incluent shared_ptr, unique_ptr, et vector.Pour plus d’informations, consultez Pointeurs intelligents (Modern C++) et Référence de bibliothèque standard C++.