Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
avviso C6331: parametro non valido: il passaggio di MEM_RELEASE insieme a MEM_DECOMMIT a <funzione> non è consentito.Questa chiamata non riuscirà
Il messaggio indica che un parametro non valido è stato passato a VirtualFree o VirtualFreeEx.VirtualFree e VirtualFreeEx respingono la combinazione di flag (MEM_RELEASE | MEM_DECOMMIT),pertanto potrebbe non essere possibile utilizzare insieme i valori MEM_DECOMMIT e MEM_RELEASE nella stessa chiamata.
Non è necessario che liberazione e rilascio si verifichino come passaggi indipendenti.Il rilascio della memoria di cui è stato eseguito il commit libererà anche le pagine.Accertarsi anche che il valore restituito di questa funzione non venga ignorato.
Esempio
Il seguente codice di esempio genera questo avviso:
#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...
}
Per risolvere il problema, non passare il valore MEM_DECOMMIT alla chiamata VirtualFree come illustrato nel seguente codice:
#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...
}
Si noti che l'utilizzo di malloc e free (e delle API relative all'allocazione di memoria dinamica) ha molti problemi in termini di perdite di memoria ed eccezioni.Per evitare interamente questi tipi di problemi di perdite ed eccezioni, utilizzare i meccanismi forniti dalla libreria STL (Standard Template Library) di C++.Questi comprendono shared_ptr, unique_ptr e vector.Per ulteriori informazioni, vedere Puntatori intelligenti (C++ moderno) e Riferimento per la libreria standard C++.