Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Paramètre non valide : le passage de MEM_RELEASE et de MEM_DECOMMIT conjointement n’est
functionpas autorisé. Cela entraîne l’échec de cet appel
Notes
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.
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 malloc les API d’allocation de mémoire dynamique associées ont de nombreux pièges en termes de free 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++.