C6250C6250

avertissement C6250 : l’appel <fonction > VirtualFree sans l’indicateur MEM_RELEASE peut libérer de la mémoire, mais pas d’adresses virtuelles (VAD) ; les descripteurs entraîne des fuites dans l’espace adressewarning C6250: Calling <function> VirtualFree without the MEM_RELEASE flag may free memory but not address descriptors (VADs); results in address space leaks

Cet avertissement indique qu’un appel à VirtualFree sans le MEM_RELEASE indicateur annule les pages uniquement et ne les libère pas.This warning indicates that a call to VirtualFree without the MEM_RELEASE flag only decommits the pages, and does not release them. Pour dégagement et libérer des pages, utilisez MEM_RELEASE indicateur dans l’appel à VirtualFree.To decommit and release pages, use MEM_RELEASE flag in call to VirtualFree. Si toutes les pages dans la région sont validés, la fonction annule tout d’abord et puis les libère.If any pages in the region are committed, the function first decommits and then releases them. Après cette opération, les pages sont dans l’état disponible.After this operation, the pages are in the free state. 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 fonctionner lorsque la zone a été réservée.If you specify this flag, dwSize must be zero, and lpAddress must point to the base address returned by the VirtualAlloc function when the region was reserved. La fonction échoue si une de ces conditions n’est pas remplie.The function fails if either of these conditions is not met.

Vous pouvez ignorer cet avertissement si votre code libère ultérieurement l’espace d’adressage en appelant VirtualFree avec la MEM_RELEASE indicateur.You can ignore this warning if your code later frees the address space by calling VirtualFree with the MEM_RELEASE flag.

Pour plus d’informations, consultez VirtualAlloc et VirtualFree.For more information see VirtualAlloc and VirtualFree.

L’utilisation de VirtualAlloc et VirtualFree ont de nombreuses pièges en termes de fuites de mémoire et des exceptions.The use of VirtualAlloc and VirtualFree have many pitfalls in terms of memory leaks and exceptions. Pour éviter ces types de fuites et totalement de problèmes d’exception, utilisez les mécanismes fournis par la bibliothèque STL (C++ Standard Template Library).To avoid these kinds of leaks and exception problems altogether, use the mechanisms that are provided by the C++ Standard Template Library (STL). Ceux-ci incluent shared_ptr, unique_ptr, et vecteur.These include shared_ptr, unique_ptr, and vector. Pour plus d’informations, consultez pointeurs intelligents et bibliothèque Standard C++.For more information, see Smart Pointers and C++ Standard Library.

ExempleExample

L’exemple de code suivant génère cet avertissement :The following sample code generates this warning:

#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 :To correct this warning, use the following sample code:

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