Advertencia C6332

Parámetro no válido: no se permite pasar cero como el parámetro dwFreeType a 'function'. Esto provocará un error en la llamada

Esta advertencia indica que se pasa un parámetro no válido a VirtualFree o VirtualFreeEx.

Comentarios

VirtualFree y VirtualFreeEx rechazan un dwFreeType parámetro de cero. El dwFreeType parámetro puede ser MEM_DECOMMIT o MEM_RELEASE. Sin embargo, es posible que los valores MEM_DECOMMIT y MEM_RELEASE no se usen juntos en la misma llamada. Además, asegúrese de que el valor devuelto de la VirtualFree función no se omite.

Nombre del análisis de código: VirtualFreeInvalidParam2

Ejemplo

El código siguiente genera la advertencia C6332 porque se pasa un parámetro no válido a la VirtualFree función :

#include <windows.h>
#define PAGELIMIT 80

DWORD dwPages = 0;  // count of pages
DWORD dwPageSize;   // page size

VOID f( VOID )
{
  LPVOID lpvBase;            // base address of the test memory
  BOOL bSuccess;
  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 );
  if (lpvBase)
  {
    // code to access memory
  }
  else
  {
    return;
  }

  bSuccess = VirtualFree( lpvBase, 0, 0 );
  // code ...
}

Para corregir esta advertencia, modifique la llamada a la VirtualFree función, como se muestra en el código siguiente:

#include <windows.h>
#define PAGELIMIT 80

DWORD dwPages = 0;  // count of pages
DWORD dwPageSize;   // page size

VOID f( VOID )
{
  LPVOID lpvBase;            // base address of the test memory
  BOOL bSuccess;
  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 );
  if (lpvBase)
  {
    // code to access memory
  }
  else
  {
    return;
  }

  bSuccess = VirtualFree( lpvBase, 0, MEM_RELEASE );
  // code ...
}

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

Consulte también

VirtualAlloc Método
VirtualFree Método