경고 C6250
MEM_RELEASE 플래그 없이 'VirtualFree'를 호출하면 메모리를 해제할 수 있지만 VAD(주소 설명자)는 사용할 수 없습니다. 주소 공간 누수 결과
이 경고는 플래그가 없는 호출 VirtualFree
은 MEM_RELEASE
페이지를 커밋 해제하고 해제하지 않음을 나타냅니다. 커밋 해제 및 릴리스 페이지 모두에 대한 호출VirtualFree
에서 플래그를 사용합니다MEM_RELEASE
. 지역에 있는 페이지가 커밋된 경우 함수는 먼저 커밋을 해제한 다음 해제합니다. 이 작업 후에는 페이지가 사용이 해제된 상태입니다. 이 플래그 dwSize
를 지정하는 경우 0이어야 하며 lpAddress
지역이 예약되었을 때 함수에서 VirtualAlloc
반환한 기본 주소를 가리킬 수 있습니다. 이러한 조건 중 하나가 충족되지 않으면 함수가 실패합니다.
설명
나중에 코드가 플래그를 사용하여 호출 VirtualFree
MEM_RELEASE
하여 주소 공간을 해제하는 경우 이 경고를 무시할 수 있습니다.
자세한 내용은 VirtualAlloc
및 VirtualFree
를 참조하세요.
메모리 누수 및 VirtualFree
예외 측면에서 많은 문제를 사용하고 VirtualAlloc
있습니다. 이러한 종류의 잠재적 누출을 완전히 방지하려면 C++ STL(표준 라이브러리)에서 제공하는 메커니즘을 사용합니다. 여기에는 < a0/> unique_ptr
및 컨테이너(예: vector
.)가 포함shared_ptr
됩니다. 자세한 내용은 스마트 포인터 및C++ 표준 라이브러리를 참조하세요.
코드 분석 이름: WIN32UNRELEASEDVADS
예시
다음 샘플 코드는 경고 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");
}
}
이 경고를 수정하려면 다음 샘플 코드를 사용합니다.
#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...
}
}
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기