Partager via


C6331

Avertissement C6331 : Paramètre non valide : le passage de MEM_RELEASE et MEM_DECOMMIT en association avec <fonction> n'est pas autorisé.Cela provoque l'échec de cet appel.

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

Il n'est pas nécessaire que l'annulation de la validation et la libération soient considérées comme des étapes indépendantes.La libération de la mémoire allouée annule également la validation des pages.Vérifiez également que la valeur de retour de cette fonction n'est pas ignorée.

Exemple

L'exemple de code suivant génère cet avertissement :

#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 pas une valeur MEM_DECOMMIT à un 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...
}

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++.

Voir aussi

Référence

IHostMemoryManager::VirtualAlloc, méthode

IHostMemoryManager::VirtualFree, méthode