Condividi tramite


Avviso C6250

La chiamata a "VirtualFree" senza il flag di MEM_RELEAedizione Standard può liberare memoria ma non descrittori di indirizzi (VAD). Genera perdite di spazio degli indirizzi

Questo avviso indica che una chiamata a VirtualFree senza il MEM_RELEASE flag decommette solo le pagine e non le rilascia. Per eseguire il decommit e le pagine di rilascio, usare il MEM_RELEASE flag nella chiamata a VirtualFree. Se viene eseguito il commit di pagine nell'area, la funzione viene prima decomplicata e quindi le rilascia. Dopo questa operazione, le pagine si trovano nello stato libero. Se si specifica questo flag, dwSize deve essere zero e lpAddress deve puntare all'indirizzo di base restituito dalla VirtualAlloc funzione quando l'area è stata riservata. La funzione ha esito negativo se una di queste condizioni non viene soddisfatta.

Osservazioni:

È possibile ignorare questo avviso se il codice libera in un secondo momento lo spazio degli indirizzi chiamando VirtualFree con il MEM_RELEASE flag .

Per altre informazioni, vedere VirtualAlloc e VirtualFree.

L'uso di VirtualAlloc e VirtualFree presenta molte insidie in termini di perdite di memoria ed eccezioni. Per evitare completamente questi tipi di potenziali perdite, usare i meccanismi forniti dalla libreria standard C++ (STL). Sono inclusi shared_ptri contenitori , e , unique_ptrad esempio vector. Per altre informazioni, vedere Puntatori intelligenti e libreria standard C++.

Nome dell'analisi del codice: WIN32UNRELEASEDVADS

Esempio

Il codice di esempio seguente genera l'avviso C6250:

#include <windows.h>
#include <stdio.h>
#define PAGELIMIT 80

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

VOID f( )
{
  LPVOID lpvBase;            // base address of the test memory
  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);
  //
  // code to access memory
  // ...

  if (lpvBase != NULL)
  {
    if (VirtualFree( lpvBase, 0, MEM_DECOMMIT )) // decommit pages
    {
      puts ("MEM_DECOMMIT Succeeded");
    }
    else
    {
      puts("MEM_DECOMMIT failed");
    }
  }
  else
  {
    puts("lpvBase == NULL");
  }
}

Per correggere questo avviso, usare il codice di esempio seguente:

#include <windows.h>
#include <stdio.h>
#define PAGELIMIT 80

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

VOID f( )
{
  LPVOID lpvBase;            // base address of the test memory
  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);
  //
  // code to access memory
  // ...

  if (lpvBase != NULL)
  {
    if (VirtualFree(lpvBase, 0,MEM_RELEASE )) // decommit & release
    {
      // code ...
    }
    else
    {
      puts("MEM_RELEASE failed");
    }
  }
  else
  {
    puts("lpvBase == Null ");
    // code...
  }
}