Avertissement C6331

Paramètre non valide : le passage de MEM_RELEASE et de MEM_DECOMMIT conjointement n’est *function* pas autorisé. Cela entraîne l’échec de cet appel

Ce message indique qu’un paramètre non valide est passé à VirtualFree ou VirtualFreeEx. VirtualFree et VirtualFreeEx les deux rejettent les indicateurs (MEM_RELEASE | MEM_DECOMMIT) en combinaison. Par conséquent, les valeurs MEM_DECOMMIT et MEM_RELEASE ne peuvent pas être utilisées ensemble dans le même appel.

Notes

Il n’est pas nécessaire que le décommit et la mise en production se produisent en tant qu’étapes indépendantes. La libération de la mémoire validée décommit également les pages. Vérifiez également que la valeur de retour de cette fonction n’est pas ignorée.

Nom de l’analyse du code : VirtualFreeInvalidParam1

Exemple

L’exemple de code suivant génère l’avertissement C6331 :

#include <windows.h>
#define PAGELIMIT 80

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

VOID fd( 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_DECOMMIT | MEM_RELEASE); // warning
  // code...
}

Pour corriger cet avertissement, ne passez MEM_DECOMMIT pas à l’appel VirtualFree , 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 free les API d’allocation de mémoire dynamique associées ont de nombreux pièges en termes de malloc 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