警告 C6250
MEM_RELEAStandard Edition フラグを指定せずに 'VirtualFree' を呼び出すと、メモリが解放される可能性がありますが、アドレス記述子 (VAD) は解放されません。その結果、アドレス空間リークが発生します
この警告は、フラグのないMEM_RELEASE
呼び出しVirtualFree
がページをコミットするだけで解放しないことを示します。 デコミット ページとリリース ページの両方に対して、次の MEM_RELEASE
呼び出しでフラグを使用します VirtualFree
。 領域内のページがコミットされている場合、ページはデコミットされてから解放されます。 この操作の後、ページは空き状態になります。 このフラグを指定する場合、dwSize
を 0 にし、領域が予約されたときに lpAddress
関数によって返されるベース アドレスを VirtualAlloc
にする必要があります。 これらの条件のいずれかが満たされていない場合、関数は失敗します。
解説
後で VirtualFree
フラグを使用して MEM_RELEASE
を呼び出し、アドレス空間を解放する場合、この警告は無視できます。
詳細については、次のトピックを参照してください。 VirtualAlloc
および VirtualFree
メモリ リークとVirtualFree
例外のVirtualAlloc
観点から、多くの落とし穴があり、使用されます。 このような潜在的なリークを完全に回避するには、C++ 標準ライブラリ (STL) によって提供されるメカニズムを使用します。 これらには、次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 の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示