C6230

avviso C6230: cast implicito tra tipi integer semanticamente diversi: utilizzo di HRESULT in un contesto Booleano

L'avviso indica che viene utilizzato un HRESULT bare in un contesto, ad esempio l'istruzione if in cui è previsto un risultato Booleano.È probabile che ciò produca risultati errati.Il valore che solitamente indica l'esito positivo per HRESULT (S_OK) risulta false quando viene testato come valore booleano.

Esempio

Il codice seguente genera questo avviso:

#include <windows.h>

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

Nella maggior parte delle situazioni, è opportuno utilizzare la macro SUCCEEDED o FAILED per testare il valore di HRESULT.Per risolvere il problema, utilizzare il codice seguente:

#include <windows.h>

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

Ai fini del presente avviso, il tipo SCODE equivale a HRESULT.

Si noti che l'utilizzo di malloc e free (e delle API relative all'allocazione di memoria dinamica) ha molti problemi in termini di perdite di memoria ed eccezioni.Per evitare interamente questi tipi di problemi di perdite ed eccezioni, utilizzare i meccanismi forniti dalla libreria STL (Standard Template Library) di C++.Questi comprendono shared_ptr, unique_ptr e vector.Per ulteriori informazioni, vedere Puntatori intelligenti (C++ moderno) e Riferimento per la libreria standard C++.