Compartir a través de


Advertencia C6250

Llamar a "VirtualFree" sin la marca de MEM_RELEASE puede liberar memoria, pero no descriptores de dirección (VAD); da como resultado pérdidas de espacio de direcciones

Comentarios

Esta advertencia indica que una llamada a VirtualFree sin la MEM_RELEASE marca solo descommite las páginas y no las libera. Para descommitar y liberar páginas, use la MEM_RELEASE marca de la 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 marcador, 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 alguna de estas condiciones.

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

Para obtener más información, vea VirtualAlloc y VirtualFree.

El uso de VirtualAlloc y VirtualFree tiene muchos problemas en términos de fugas de memoria y excepciones. Para evitar estos tipos de posibles fugas por completo, use los mecanismos proporcionados por la biblioteca estándar de C++ (STL). Entre ellos se incluyen shared_ptrlos contenedores , unique_ptry , como vector. Para más información, consulte los artículos sobre punteros inteligentes y la biblioteca estándar de C++.

Nombre de análisis de código: WIN32UNRELEASEDVADS

Ejemplo

El código de ejemplo siguiente genera la advertencia 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");
  }
}

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

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