Partager via


Avertissement C6332

Paramètre non valide : le passage de zéro comme paramètre dwFreeType à 'function' n’est pas autorisé. Cela entraîne l’échec de cet appel

Cet avertissement indique qu’un paramètre non valide est passé à VirtualFree ou VirtualFreeEx.

Notes

VirtualFree et VirtualFreeEx les deux rejettent un dwFreeType paramètre de zéro. Le dwFreeType paramètre peut être soit MEM_DECOMMIT soit MEM_RELEASE. Toutefois, les valeurs MEM_DECOMMIT et MEM_RELEASE ne peuvent pas être utilisées ensemble dans le même appel. Vérifiez également que la valeur de retour de la VirtualFree fonction n’est pas ignorée.

Nom de l’analyse du code : VirtualFreeInvalidParam2

Exemple

Le code suivant génère l’avertissement C6332, car un paramètre non valide est passé à la VirtualFree fonction :

#include <windows.h>
#define PAGELIMIT 80

DWORD dwPages = 0;  // count of pages
DWORD dwPageSize;   // page size

VOID f( VOID )
{
  LPVOID lpvBase;            // base address of the test memory
  BOOL bSuccess;
  SYSTEM_INFO sSysInfo;      // system information

  GetSystemInfo( &sSysInfo );
  dwPageSize = sSysInfo.dwPageSize;

  // Reserve pages in the process's virtual address space
  lpvBase = VirtualAlloc(
                         NULL,                // system selects address
                         PAGELIMIT*dwPageSize, // size of allocation
                         MEM_RESERVE,
                         PAGE_NOACCESS );
  if (lpvBase)
  {
    // code to access memory
  }
  else
  {
    return;
  }

  bSuccess = VirtualFree( lpvBase, 0, 0 );
  // code ...
}

Pour corriger cet avertissement, modifiez l’appel à la VirtualFree fonction, comme indiqué dans le code suivant :

#include <windows.h>
#define PAGELIMIT 80

DWORD dwPages = 0;  // count of pages
DWORD dwPageSize;   // page size

VOID f( VOID )
{
  LPVOID lpvBase;            // base address of the test memory
  BOOL bSuccess;
  SYSTEM_INFO sSysInfo;      // system information

  GetSystemInfo( &sSysInfo );
  dwPageSize = sSysInfo.dwPageSize;

  // Reserve pages in the process's virtual address space
  lpvBase = VirtualAlloc(
                         NULL,                // system selects address
                         PAGELIMIT*dwPageSize, // size of allocation
                         MEM_RESERVE,
                         PAGE_NOACCESS );
  if (lpvBase)
  {
    // code to access memory
  }
  else
  {
    return;
  }

  bSuccess = VirtualFree( lpvBase, 0, MEM_RELEASE );
  // code ...
}

L’utilisation et présente de nombreux pièges en termes de VirtualAlloc VirtualFree fuites de mémoire et d’exceptions. Pour éviter ces types de fuites potentielles, utilisez les mécanismes fournis par la bibliothèque C++ Standard (STL). Ceux-ci incluent shared_ptr, unique_ptret des conteneurs tels que vector. Pour plus d’informations, consultez Les pointeurs intelligents et la bibliothèque standard C++.

Voir aussi

VirtualAlloc Méthode
VirtualFree Méthode