Partilhar via


C6250

Aviso C6250: Chamar <função> VirtualFree sem o sinalizador MEM_RELEASE pode liberar memória, mas não descritores de endereço (VADs); resulta em vazamentos de espaço de endereço

Este aviso indica que uma chamada a VirtualFree sem o sinalizador MEM_RELEASE apenas anula a confirmação das páginas, e não as libera.Para cancelar a confirmação e liberar páginas, use o sinalizador MEM_RELEASE na chamada a VirtualFree.Se qualquer página na região for confirmada, a função primeiro desfaz a confirmação e, em seguida, as libera.Depois dessa operação, as páginas ficarão em estado livre.Se você especificar este sinalizador, dwSize deve ser zero, e lpAddress deve apontar para o endereço básico retornado pela função de VirtualAlloc quando a região tiver sido reservada.A função falhará se qualquer uma dessas condições não for atendida.

Você poderá ignorar este aviso se seu código liberar posteriormente espaço de endereço chamando VirtualFree com o sinalizador MEM_RELEASE.

Para obter mais informações, consulte VirtualAlloc e VirtualFree.

O uso de VirtualAlloc e VirtualFree tem muitas armadilhas em termos de vazamentos de memória e exceções.Para evitar esses tipos de vazamentos e problemas de exceção no geral, use os mecanismos que são fornecidos pela STL (Biblioteca de Modelos Padrão) do C++.Incluem shared_ptr, unique_ptr e vector.Para obter mais informações, consulte Ponteiros inteligentes (C++ moderno) e Referência da Biblioteca Padrão C++.

Exemplo

O código de exemplo a seguir gera este aviso:

#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");
  }
}

Para corrigir esse aviso, use o seguinte código de exemplo:

#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...
  }
}