Uyarı C6331

Geçersiz parametre: MEM_RELEASE ve MEM_DECOMMIT ile birlikte geçirilmesine function izin verilmez. Bu, bu çağrının başarısızlığına neden olur

Açıklamalar

Bu ileti, veya VirtualFreeöğesine VirtualFreeEx geçersiz bir parametre geçirildiğini gösterir. VirtualFree ve VirtualFreeEx her ikisi de () bayraklarınıMEM_RELEASE | MEM_DECOMMIT birlikte reddeder. Bu nedenle ve değerleri MEM_DECOMMITMEM_RELEASE aynı çağrıda birlikte kullanılamayabilir.

Bağımsız adımlar olarak decommit ve release için gerekli değildir. Kaydedilmiş belleğin serbest bırakılması sayfaları da kullanımdan kaldıracaktır. Ayrıca, bu işlevin dönüş değerinin yoksayılmış olmadığından emin olun.

Kod analizi adı: VirtualFreeInvalidParam1

Örnek

Aşağıdaki örnek kod C6331 uyarısını oluşturur:

#include <windows.h>
#define PAGELIMIT 80

DWORD dwPages = 0;  // count of pages
DWORD dwPageSize;   // page size

VOID fd( VOID )
{
  LPVOID lpvBase;            // base address of the test memory
  BOOL bSuccess;
  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 );
  if (lpvBase)
  {
    // code to access memory
  }
  else
  {
    return;
  }
  bSuccess = VirtualFree(lpvBase,
                0,
                MEM_DECOMMIT | MEM_RELEASE); // warning
  // code...
}

Bu uyarıyı MEM_DECOMMIT düzeltmek için aşağıdaki kodda gösterildiği gibi çağrısına geçmeyinVirtualFree:

#include <windows.h>
#define PAGELIMIT 80

DWORD dwPages = 0;  // count of pages
DWORD dwPageSize;   // page size

VOID f( VOID )
{
  LPVOID lpvBase;            // base address of the test memory
  BOOL bSuccess;
  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 );
  if (lpvBase)
  {
    // code to access memory
  }
  else
  {
    return;
  }
  bSuccess = VirtualFree(lpvBase, 0, MEM_RELEASE);
  // code...
}

ve malloc (ve ilgili dinamik bellek ayırma API'lerinin) kullanımında free bellek sızıntıları ve özel durumlar açısından birçok tuzak vardır. Bu tür olası sızıntıları tamamen önlemek için C++ Standart Kitaplığı (STL) tarafından sağlanan mekanizmaları kullanın. Bunlar , shared_ptrve gibi unique_ptrkapsayıcıları içerirvector. Daha fazla bilgi için bkz . Akıllı işaretçiler ve C++ Standart Kitaplığı.

Ayrıca bkz.

VirtualAlloc Yöntem
VirtualFree Yöntem