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