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