C6331

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

Vedere anche

Riferimenti

Metodo IHostMemoryManager::VirtualAlloc

Metodo IHostMemoryManager::VirtualFree