次の方法で共有


警告 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...
  }
}