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_ptr
et des conteneurs tels que vector
. Pour plus d’informations, consultez Les pointeurs intelligents et la bibliothèque standard C++.
Voir aussi
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour