Avertissement C6250
L’appel de « VirtualFree » sans l’indicateur de MEM_RELEASE peut libérer de la mémoire, mais pas des descripteurs d’adresses (VAD) ; entraîne des fuites d’espace d’adressage
Cet avertissement indique qu’un appel à VirtualFree
sans l’indicateur MEM_RELEASE
supprime uniquement les pages et ne les libère pas. Pour décommit et les pages de mise en production, utilisez l’indicateur MEM_RELEASE
dans l’appel à VirtualFree
. Si des pages de la région sont validées, la fonction commence par les décommits, puis les libère. Après cette opération, les pages sont dans l’état libre. Si vous spécifiez cet indicateur, dwSize
doit être égal à zéro et lpAddress
doit pointer vers l’adresse de base retournée par la VirtualAlloc
fonction lorsque la région a été réservée. La fonction échoue si l’une de ces conditions n’est pas remplie.
Notes
Vous pouvez ignorer cet avertissement si votre code libère ultérieurement l’espace d’adressage en appelant VirtualFree
avec l’indicateur MEM_RELEASE
.
Pour plus d’informations, consultez VirtualAlloc
et VirtualFree
.
L’utilisation et présente de nombreux pièges en termes de VirtualAlloc
VirtualFree
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++.
Nom de l’analyse du code : WIN32UNRELEASEDVADS
Exemple
L’exemple de code suivant génère l’avertissement C6250 :
#include <windows.h>
#include <stdio.h>
#define PAGELIMIT 80
DWORD dwPages = 0; // count of pages
DWORD dwPageSize; // page size
VOID f( )
{
LPVOID lpvBase; // base address of the test memory
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);
//
// code to access memory
// ...
if (lpvBase != NULL)
{
if (VirtualFree( lpvBase, 0, MEM_DECOMMIT )) // decommit pages
{
puts ("MEM_DECOMMIT Succeeded");
}
else
{
puts("MEM_DECOMMIT failed");
}
}
else
{
puts("lpvBase == NULL");
}
}
Pour corriger cet avertissement, utilisez l’exemple de code suivant :
#include <windows.h>
#include <stdio.h>
#define PAGELIMIT 80
DWORD dwPages = 0; // count of pages
DWORD dwPageSize; // page size
VOID f( )
{
LPVOID lpvBase; // base address of the test memory
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);
//
// code to access memory
// ...
if (lpvBase != NULL)
{
if (VirtualFree(lpvBase, 0,MEM_RELEASE )) // decommit & release
{
// code ...
}
else
{
puts("MEM_RELEASE failed");
}
}
else
{
puts("lpvBase == Null ");
// code...
}
}
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