Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Nieprawidłowy parametr: przekazywanie MEM_RELEASE i MEM_DECOMMIT w połączeniu z
functionnie jest dozwolone. Powoduje to niepowodzenie tego wywołania
Uwagi
Ten komunikat wskazuje, że nieprawidłowy parametr jest przekazywany do VirtualFree elementu lub VirtualFreeEx.
VirtualFree i VirtualFreeEx oba odrzucają flagi (MEM_RELEASE | MEM_DECOMMIT) w kombinacji. W związku z tym wartości MEM_DECOMMIT i MEM_RELEASE mogą nie być używane razem w tym samym wywołaniu.
Nie jest wymagane, aby anulować zatwierdzanie i wydawanie odbywało się jako niezależne kroki. Zwalnianie zatwierdzonej pamięci spowoduje również anulowanie stronicowania. Upewnij się również, że zwracana wartość tej funkcji nie jest ignorowana.
Nazwa analizy kodu: VirtualFreeInvalidParam1
Przykład
Poniższy przykładowy kod generuje ostrzeżenie C6331:
#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...
}
Aby poprawić to ostrzeżenie, nie przekazuj MEM_DECOMMIT do wywołania VirtualFree , jak pokazano w poniższym kodzie:
#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...
}
Korzystanie z interfejsów API alokacji pamięci dynamicznej malloc i free (i powiązanych) ma wiele pułapek w zakresie przecieków pamięci i wyjątków. Aby całkowicie uniknąć tego rodzaju potencjalnych wycieków, należy użyć mechanizmów dostarczanych przez standardową bibliotekę języka C++ (STL). Należą do shared_ptrnich kontenery , unique_ptri, takie jak vector. Aby uzyskać więcej informacji, zobacz Inteligentne wskaźniki i Standardowa biblioteka języka C++.