Ci-dessous est juste un exemple de code de test court pour illustrer ma question:Comment supprimer plusieurs allocations de mémoire virtuelle adjacentes avec un appel VirtualFree?
SYSTEM_INFO si;
GetSystemInfo(&si);
//Go by allocation granularity to have a chance to reserve adjacent memory chunks
size_t szAlloc = si.dwAllocationGranularity;
//Try to alloc two adjacent memory chunks
BYTE* pp1 = (BYTE *)::VirtualAlloc(NULL, szAlloc, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
ASSERT(pp1);
BYTE* pp2 = (BYTE *)::VirtualAlloc(pp1 + szAlloc, szAlloc, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
ASSERT(pp2);
//We should be able to write between them
WORD ui = 0xAB;
BYTE* p = pp1 + szAlloc - sizeof(ui)/2;
*(WORD*)p = ui;
//Release both at once
BOOL bb = ::VirtualFree(pp1, szAlloc + szAlloc, MEM_RELEASE);
int err = ::GetLastError();
Comment puis-je libérer les deux morceaux de mémoire avec un appel? Ou les consolider en un morceau, si la libération à la fois n'est pas autorisée? (La raison pour laquelle je demande est parce que dans mon code actuel il peut y avoir plus que juste 2 morceaux adjacents.)
PS. Dans le code de test ci-dessus VirtualFree
échoue avec le code d'erreur ERROR_INVALID_ADDRESS
.
L'autre problème avec votre code est qu'il n'y a aucune garantie que le deuxième morceau d'adresse –
@HarryJohnston: Oui, c'est vrai, comme je l'ai dit, c'est un code de test pour illustrer concept. Dans un scénario réel, si le second bloc n'est pas disponible, je vais devoir 'VirtualAlloc' le tout et le' memcpy'. – c00000fd