Partager via


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.

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