#include <Windows.h>
#include <iostream>
using namespace std;
int main(void)
{
unsigned char* pFoo = new unsigned char[1000];
pFoo = (unsigned char*)VirtualAlloc(NULL, 1000, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
VirtualFree(pFoo, 0, MEM_RELEASE);
delete[] pFoo;
cin.ignore();
cin.get();
return 0;
}
Это падает для меня в
delete[] pFoo;
Я знаю, что это происходит из-за VirtualAlloc, но я не знаю, как это исправить...
Ответ 1 · рейтинг 1 · Mysticial
Вы используете одну и ту же переменную. Итак, ваше первое распределение просочилось.
После того, как вы освободите его с помощью VirtualFree, указатель станет недействительным. Итак, delete на нем не определено.
Более того:
Вы не можете смешивать VirtualAlloc и delete по той же причине, по которой вы не можете смешивать malloc с delete.
Ответ 2 · рейтинг 1 · Ben Voigt
unsigned char* pFoo = new unsigned char[1000];
Теперь pFoo содержит указатель на динамическую память.
pFoo = (unsigned char*)VirtualAlloc(NULL, 1000, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
Это перезаписывает старый указатель, происходит утечка массива 1000 char.
Пытаться:
unsigned char* pFoo = new unsigned char[1000];
unsigned char* pBar = (unsigned char*)VirtualAlloc(NULL, 1000, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
VirtualFree(pBar, 0, MEM_RELEASE);
delete[] pFoo;
Ответ 3 · рейтинг 1 · Graham Perks
Либо используйте new/delete, либо VirtualAlloc/VirtualFree. Вы выделяете два отдельных блока памяти, используя pFoo для обращения к обоим (когда, конечно, он может обращаться только к одному за раз), а затем вызываете две свободные функции с помощью pFoo. Один из них провалится :)