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