C6250

Aktualisiert: November 2007

C6250

Warnung C6250: Durch den Aufruf von <Funktion> ohne das MEM_RELEASE-Flag wird zwar Arbeitsspeicher freigegeben, aber keine Adressdeskriptoren (VADs). Dies hat Adressraumverluste zur Folge.

Diese Warnung gibt an, dass ein Aufruf von VirtualFree ohne das MEM_RELEASE-Flag nur einen Decommit für die Seiten ausführt, diese aber nicht freigibt. Um für Seiten einen Decommit auszuführen und die Seiten freizugeben, verwenden Sie im Aufruf von VirtualFree das MEM_RELEASE-Flag. Wenn für Seiten im Bereich ein Commit ausgeführt wird, führt die Funktion zuerst einen Decommit für die Seiten aus und gibt dann die Seiten frei. Nach diesem Vorgang sind die Seiten freigegeben. Wenn Sie dieses Flag angeben, muss dwSize gleich 0 (null) sein, und lpAddress muss auf die Basisadresse verweisen, die von der VirtualAlloc-Funktion zurückgegeben wurde, als der Bereich reserviert wurde. Die Funktion schlägt fehl, wenn eine der beiden Bedingungen nicht erfüllt wird.

Sie können diese Warnung ignorieren, wenn der Code den Adressbereich später durch Aufrufen von VirtualFree mit dem MEM_RELEASE-Flag freigibt.

Beispiel

Im folgenden Beispielcode wird diese Warnung generiert:

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

So korrigieren Sie die Warnung unter Verwendung des folgenden Beispielcodes

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