Freigeben über


Warnung C6250

Das Aufrufen von "VirtualFree" ohne das flag MEM_RELEASE kann Arbeitsspeicher freigeben, jedoch keine Adressdeskriptoren (VADs); führt zu Lecks im Adressraum

Diese Warnung gibt an, dass ein Aufruf VirtualFree ohne das MEM_RELEASE Flag nur die Seiten außer Verbindung stellt und sie nicht losgibt. Verwenden Sie zum Aufheben und Freigeben von Seiten das MEM_RELEASE Flag im Aufruf von VirtualFree. 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 dieser Bedingungen nicht erfüllt ist.

Hinweise

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

Weitere Informationen finden Sie unter VirtualAlloc und VirtualFree.

Die Verwendung von VirtualAlloc und VirtualFree hat viele Fallstricke in Bezug auf Speicherlecks und Ausnahmen. Um diese Arten potenzieller Lecks vollständig zu vermeiden, verwenden Sie die Mechanismen, die von der C++-Standardbibliothek (STL) bereitgestellt werden. Dazu gehören shared_ptr, , unique_ptrund Container wie vector. Weitere Informationen finden Sie unter Intelligente Zeiger und C++-Standardbibliothek.

Codeanalysename: WIN32UNRELEASEDVADS

Beispiel

Der folgende Beispielcode generiert Warnung 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");
  }
}

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