Compartir a través de


C6331

Advertencia C6331: Parámetro no válido: no se permite pasar MEM_RELEASE y MEM_DECOMMIT junto con <función>.Esto provocará un error en la llamada

Este mensaje indica que se pasa un parámetro no válido a VirtualFree o VirtualFreeEx.VirtualFree y VirtualFreeEx rechazan los marcadores (MEM_RELEASE | MEM_DECOMMIT) en combinación.Por consiguiente, los valores MEM_DECOMMIT y MEM_RELEASE no se pueden utilizar juntos en la misma llamada.

No es imprescindible que la anulación de registro y la liberación se realicen en pasos independientes.Al liberar la memoria confirmada, también se anula el registro de las páginas.Además, asegúrese de que no se omita el valor devuelto de esta función.

Ejemplo

El siguiente ejemplo de código genera esta advertencia:

#include <windows.h>
#define PAGELIMIT 80

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

VOID fd( 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_DECOMMIT | MEM_RELEASE); // warning 
  // code...
}

Para corregir esta advertencia, no pase el valor MEM_DECOMMIT a la llamada a VirtualFree como se muestra 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...
}

Tenga en cuenta que el uso de las opciones malloc y free (y las API de asignación de memoria dinámica relacionadas) tiene muchos riesgos en cuanto a pérdidas de memoria y excepciones.Para evitar todos estos tipos de problemas de pérdidas de memoria y excepciones, use los mecanismos proporcionados por la Biblioteca de plantillas estándar (STL) de C++.Estos incluyen shared_ptr, unique_ptr y vector.Para obtener más información, vea Punteros inteligentes (C++ moderno) y Referencia de biblioteca estándar de C++.

Vea también

Referencia

IHostMemoryManager::VirtualAlloc (Método)

IHostMemoryManager::VirtualFree (Método)