Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Создать/удалить[] и VirtualAlloc

Автор вопроса: replicantОтветов: 3
#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, но я не знаю, как это исправить...

c++delete-operatormemorynew-operatorvirtualalloc

Ответы

Ответ 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. Один из них провалится :)

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы