C6250
upozornění C6250: Volání <function> VirtualFree bez příznaku MEM_RELEASE může uvolnit paměť, ale ne popisovače adresy (VAD); výsledky v nevracení adresního prostoru
Toto upozornění indikuje, že volání do VirtualFree bez příznaku MEM_RELEASE pouze rozváže stránky, ale neuvolní je.Pro rozvázání a uvolnění stránek použijte příznak MEM_RELEASE ve volání do VirtualFree.Pokud jsou jakékoli stránky v oblasti vázané, funkce je nejprve rozváže a pak je uvolní.Po provedení této operace jsou stránky ve volném stavu.Při zadání tohoto příznaku musí být dwSize nula a lpAddress musí odkazovat na základní adresu vrácenou funkcí VirtualAlloc, když byla oblast rezervovaná.Pokud některá z těchto podmínek není splněna, funkce se nezdaří.
Toto upozornění je možné ignorovat, pokud kód později uvolní adresní prostor voláním VirtualFree s příznakem MEM_RELEASE.
Další informace viz VirtualAlloc a VirtualFree.
Použití VirtualAlloc a VirtualFree má mnoho nástrah v podobě nevracení paměti a výjimek.Chcete-li zabránit těmto druhům problémů úniky a výjimkami zcela, použijte mechanismy, které jsou k dispozici v knihovně C++ STL.Patří mezi ně shared_ptr, unique_ptr a vector.Další informace naleznete v tématu Chytré ukazatele (moderní verze jazyka C++) a Standardní knihovna C++ – referenční dokumentace.
Příklad
Následující ukázka kódu generuje toto upozornění:
#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");
}
}
Pro opravu tohoto upozornění použijte následující ukázkový kód:
#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...
}
}