C6250
avertissement C6250 : L'appel de <fonction> sans l'indicateur MEM_RELEASE peut libérer de la mémoire mais pas les descripteurs d'adresses virtuelles (VAD) ; cela peut provoquer des fuites dans l'espace d'adressage
Cet avertissement indique qu'un appel à VirtualFree sans l'indicateur MEM_RELEASE annule uniquement la validation des pages, mais ne les libère pas.Pour annuler la validation et libérer des pages, utilisez l'indicateur MEM_RELEASE dans l'appel à VirtualFree.Si des pages de la zone sont validées, la fonction annule d'abord leur validation puis les libère.Une fois cette opération terminée, 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 fonction VirtualAlloc lorsque la zone a été réservée.La fonction échoue si l'une ou l'autre de ces conditions n'est pas remplie.
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 de VirtualAlloc et de VirtualFree présente de nombreux pièges en terme 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++.
Exemple
L'exemple de code suivant génère cet avertissement :
#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...
}
}