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