Warnung C6331
Ungültiger Parameter: Das Übergeben von MEM_RELEASE und MEM_DECOMMIT in Verbindung
*function*
ist nicht zulässig. Dies führt zu einem Fehler bei diesem Aufruf.
Diese Meldung gibt an, dass ein ungültiger Parameter an VirtualFree
oder VirtualFreeEx
. VirtualFree
und VirtualFreeEx
beide weisen die Flags (MEM_RELEASE | MEM_DECOMMIT
) in Kombination zurück. Daher werden die Werte MEM_DECOMMIT
und MEM_RELEASE
möglicherweise nicht zusammen im gleichen Aufruf verwendet.
Hinweise
Es ist nicht erforderlich, dass die Dekommittierung und Freigabe als unabhängige Schritte ausgeführt werden. Bei der Freigabe von belegtem Speicher wird auch ein Decommit für die Seiten ausgeführt. Stellen Sie außerdem sicher, dass der Rückgabewert dieser Funktion nicht ignoriert wird.
Codeanalysename: VirtualFreeInvalidParam1
Beispiel
Im folgenden Beispielcode wird die Warnung C6331 generiert:
#include <windows.h>
#define PAGELIMIT 80
DWORD dwPages = 0; // count of pages
DWORD dwPageSize; // page size
VOID fd( VOID )
{
LPVOID lpvBase; // base address of the test memory
BOOL bSuccess;
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 );
if (lpvBase)
{
// code to access memory
}
else
{
return;
}
bSuccess = VirtualFree(lpvBase,
0,
MEM_DECOMMIT | MEM_RELEASE); // warning
// code...
}
Um diese Warnung zu korrigieren, übergeben MEM_DECOMMIT
Sie nicht an den VirtualFree
Aufruf, wie im folgenden Code gezeigt:
#include <windows.h>
#define PAGELIMIT 80
DWORD dwPages = 0; // count of pages
DWORD dwPageSize; // page size
VOID f( VOID )
{
LPVOID lpvBase; // base address of the test memory
BOOL bSuccess;
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 );
if (lpvBase)
{
// code to access memory
}
else
{
return;
}
bSuccess = VirtualFree(lpvBase, 0, MEM_RELEASE);
// code...
}
Die Verwendung und malloc
free
(und verwandte APIs für die dynamische Speicherzuweisung) 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.
Siehe auch
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für