次の方法で共有


C6250

警告 C6250: MEM_RELEASE フラグなしに <関数> VirtualFree を呼び出すことで、メモリが解放される可能性はありますが、アドレスの説明 (VAD) は解放されません。これは、アドレス スペース リークを発生させる原因になります

この警告は、MEM_RELEASE フラグを使用せずに VirtualFree を呼び出すことで、ページがデコミットされるが解放はされないことを示します。ページをデコミットおよび解放するには、VirtualFree の呼び出し時に MEM_RELEASE フラグを使用します。領域内のページがコミットされている場合、ページはデコミットされてから解放されます。この操作の後、ページは空き状態になります。このフラグを指定する場合、dwSize を 0 にし、領域が予約されたときに VirtualAlloc 関数によって返されるベース アドレスを lpAddress にする必要があります。この条件が両方とも満たされないと、エラーが発生します。

後で MEM_RELEASE フラグを使用して VirtualFree を呼び出し、アドレス空間を解放する場合、この警告は無視できます。

詳細については、「VirtualAlloc」および「VirtualFree」を参照してください。

VirtualAlloc と VirtualFree の使用には、メモリ リークと例外に関して多くの落とし穴があります。これらのリークと例外の問題を完全に回避するには、C++ の標準テンプレート ライブラリ (STL) によって提供される機構を使用します。これには、shared_ptrunique_ptrvector などがあります。詳細については、「スマート ポインター (Modern C++)」および「C++ 標準ライブラリ リファレンス」を参照してください。

使用例

この警告が発生するコード例を次に示します。

#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...
  }
}