Condividi tramite


C6250

Aggiornamento: novembre 2007

C6250

avviso C6250: La chiamata di <funzione> VirtualFree senza il flag MEM_RELEASE potrebbe liberare la memoria ma non i descrittori di indirizzo (VAD), con conseguente perdita di spazio

L'avviso indica che una chiamata a VirtualFree senza il flag MEM_RELEASE libera solo le pagine, senza rilasciarle. Per liberare e rilasciare le pagine, utilizzare il flag MEM_RELEASE nella chiamata a VirtualFree. Se nell'area sono presenti pagine modificate, la funzione dapprima le libera, quindi le rilascia. Dopo questa operazione le pagine sono in stato libero. Se si specifica tale flag, dwSize deve essere zero, mentre lpAddress deve fare riferimento all'indirizzo base restituito dalla funzione VirtualAlloc quando l'area era riservata. Se una di queste condizioni non si verifica, la funzione ha esito negativo.

L'avviso può essere ignorato se il codice in seguito libererà lo spazio degli indirizzi chiamando VirtualFree con il flag MEM_RELEASE.

Esempio

Il codice di esempio seguente genera questo avviso:

#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");
  }
}

Per risolvere il problema, utilizzare il codice di esempio seguente:

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