Advertencia C6331
Parámetro no válido: no se permite pasar MEM_RELEASE y MEM_DECOMMIT junto a
*function*
. Esto provocará un error en la llamada
Este mensaje indica que se ha pasado un parámetro no válido a VirtualFree
o VirtualFreeEx
. Tanto VirtualFree
como 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.
Comentarios
No es necesario que la descommita y la versión se produzcan como pasos independientes. Al liberar la memoria confirmada, también se anula el registro de las páginas. Además, asegúrese de que el valor devuelto de esta función no se omite.
Nombre del análisis de código: VirtualFreeInvalidParam1
Ejemplo
El código de ejemplo siguiente genera la advertencia C6331:
#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 MEM_DECOMMIT
a la VirtualFree
llamada, 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 malloc
y free
(y las API de asignación dinámica de memoria relacionadas) tiene muchos problemas en términos de pérdidas 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_ptr
los contenedores , unique_ptr
y , como vector
. Para más información, consulte los artículos sobre punteros inteligentes y la biblioteca estándar de C++.
Consulte también
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de