C6250

تحذير C6250: استدعاء <دالة> VirtualFree دون فقد تحرير ذاكرة يؤشر MEM_RELEASE ولكن لا تعالج واصفات (VADs) ينتج تسرب مسافة العنوان

هذا التحذير يشير إلى أن استدعاء VirtualFreeدون MEM_RELEASEdecommits يؤشر فقط للصفحات، و لم حررها. إلى decommit و قم بتحرير الصفحات، استخدم MEM_RELEASEيؤشر في الدعوة إلى VirtualFree. إذا كان يتم تنفيذ أية الصفحات في المنطقة، دالة أولاً decommits و تطلق عليها. بعد هذه تشغيل، الصفحات الموجودة في الحالة الحرة. إذا قمت بتعيين هذه يؤشر dwSizeيجب أن تكون صفراً، و lpAddressيجب أن يشير إلى العنوان الأساسي الذي تم إرجاعه بواسطة VirtualAllocدالة عندما تم محجوز المنطقة. وتفشل الوظيفة إذا كان أي من هذه الشروط هو لم يتحقق.

يمكنك تجاهل هذا التحذير إذا الخاص بك تعليمات برمجية فيما بعد بتحرير مسافة العنوان بواسطة استدعاء VirtualFreeمع MEM_RELEASEيؤشر.

لمزيد من معلومات راجع VirtualAlloc و VirtualFree .

مثال

نموذج تعليمات برمجية التالي بإنشاء هذا تحذير:

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