Avertissement C6250

L’appel de « VirtualFree » sans l’indicateur de MEM_RELEASE peut libérer de la mémoire, mais pas des descripteurs d’adresses (VAD) ; entraîne des fuites d’espace d’adressage

Cet avertissement indique qu’un appel à VirtualFree sans l’indicateur MEM_RELEASE supprime uniquement les pages et ne les libère pas. Pour décommit et les pages de mise en production, utilisez l’indicateur MEM_RELEASE dans l’appel à VirtualFree. Si des pages de la région sont validées, la fonction commence par les décommits, puis les libère. Après cette opération, les pages sont dans l’état libre. Si vous spécifiez cet indicateur, dwSize doit être égal à zéro et lpAddress doit pointer vers l’adresse de base retournée par la VirtualAlloc fonction lorsque la région a été réservée. La fonction échoue si l’une de ces conditions n’est pas remplie.

Notes

Vous pouvez ignorer cet avertissement si votre code libère ultérieurement l’espace d’adressage en appelant VirtualFree avec l’indicateur MEM_RELEASE .

Pour plus d’informations, consultez VirtualAlloc et VirtualFree.

L’utilisation et présente de nombreux pièges en termes de VirtualAllocVirtualFree fuites de mémoire et d’exceptions. Pour éviter ces types de fuites potentielles, utilisez les mécanismes fournis par la bibliothèque C++ Standard (STL). Ceux-ci incluent shared_ptr, unique_ptret des conteneurs tels que vector. Pour plus d’informations, consultez Les pointeurs intelligents et la bibliothèque standard C++.

Nom de l’analyse du code : WIN32UNRELEASEDVADS

Exemple

L’exemple de code suivant génère l’avertissement 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");
  }
}

Pour corriger cet avertissement, utilisez l’exemple de code suivant :

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