Partager via


Avertissement C6333

Paramètre non valide : le passage de MEM_RELEASE et d’un paramètre dwSize non nul à « function_name » n’est pas autorisé. Cela entraîne l’échec de cet appel

Notes

Les deux VirtualFree et VirtualFreeEx rejettent une dwFreeType valeur MEM_RELEASE non nulle de dwSize. Lorsqu’il MEM_RELEASE est passé, le dwSize paramètre doit être égal à zéro.

Nom de l’analyse du code : VIRTUALFREEINVALIDPARAM3

Exemple

L’exemple de code suivant génère cet avertissement :

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

Pour corriger cet avertissement, vérifiez que la valeur de dwSize 0 est 0 dans l’appel à VirtualFree:

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

Vous pouvez également utiliser l’appel VirtualFree(lpvBase, PAGELIMIT * dwPageSize, MEM_DECOMMIT); aux pages decommit, puis les libérer ultérieurement à l’aide d’un MEM_RELEASE indicateur.

Voir aussi