C6333

تحذير C6333: غير صالح معلمة: تمرير MEM_RELEASE ومعلمة dwSize غير الصفرية إلى <دالة> هو ‏‏غير مسموح به. وهذا نتائج في فشل هذه المكالمة

Th هو التحذير يشير إلى معلمة غير صالحة هو التي يتم تمريرها إلى VirtualFree أو VirtualFreeEx. كلاهما من هذه الدالات برفض dwFreeType MEM_RELEASE dwSize القيمة غير صفرية. عند تمرير MEM_RELEASE، يجب أن تكون معلمة dwSize صفر. أيضا، تأكد من أن قيمة الإرجاع ل th هو دالة هو لا تجاهل.

مثال

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

#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, PAGELIMIT * dwPageSize, MEM_RELEASE); 
  //code...
}

إلى تصحيح هذا التحذير، استخدم نموذج تعليمات برمجية التالي:

#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 );

  //  VirtualFree(lpvBase, PAGELIMIT * dwPageSize, MEM_DECOMMIT); 
  // code...
}

يمكنك أيضا استخدام VirtualFree(lpvBase, PAGELIMIT * dwPageSize, MEM_DECOMMIT)؛ قم باستدعاء إلى decommit الصفحات، و فيما بعد بتحرير استخدام يؤشر MEM_RELEASE.

راجع أيضًا:

المرجع

أسلوب IHostMemoryManager::VirtualAlloc

أسلوب IHostMemoryManager::VirtualFree