Compartir a través de


C6250

Actualización: noviembre 2007

C6250

Advertencia C6250: Si llama a <función> sin la etiqueta MEM_RELEASE se podrá liberar memoria pero no descriptores de dirección (VAD), lo que ocasionará pérdidas de espacio de dirección

Esta advertencia indica que una llamada a VirtualFree sin el indicador MEM_RELEASE sólo anula el registro de las páginas, y no las libera. Para anular el registro de las páginas y liberarlas, utilice el indicador MEM_RELEASE en una llamada a VirtualFree. Si cualquiera de las páginas de la región está confirmada, la función anula el registro y luego las libera. Después de esta operación, las páginas quedan en el estado libre. Si especifica este indicador, dwSize debe ser cero y lpAddress debe señalar a la dirección base devuelta por la función VirtualAlloc al reservar la región. Se produce un error en la función si no se cumple cualquiera de estas condiciones.

Puede omitir esta advertencia si el código libera el espacio de direcciones más adelante llamando a VirtualFree con el indicador MEM_RELEASE.

Ejemplo

El siguiente ejemplo de código genera esta advertencia:

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

Para corregir esta advertencia, utilice el siguiente código de ejemplo:

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