Новый / удалить [] и VirtualAlloc - PullRequest
0 голосов
/ 10 октября 2011
#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, но я не уверен, как это исправить ...

Ответы [ 3 ]

1 голос
/ 10 октября 2011
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;
1 голос
/ 10 октября 2011

Либо используйте new / delete, либо VirtualAlloc / VirtualFree. Вы выделяете два отдельных блока памяти, используя pFoo для ссылки на оба (когда, конечно, он может ссылаться только на один за раз) и затем вызываете две свободные функции с помощью pFoo. Один из них потерпит неудачу:)

1 голос
/ 10 октября 2011

Вы используете ту же переменную.Итак, ваше первое выделение пропало.

После того, как вы освободите его с помощью VirtualFree, указатель будет недействительным.Поэтому delete для него не определено.

Более того:

Вы не можете смешивать VirtualAlloc и delete по той же причине, по которой вы не можете смешивать malloc с delete.

...