New/delete[] and VirtualAlloc

New/delete[] and VirtualAlloc

本文关键字:and VirtualAlloc delete New      更新时间:2023-10-16
#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,但我不知道如何解决这个问题…

您使用相同的变量。所以你的第一个分配被泄露了。

使用VirtualFree释放后,指针无效。所以delete是未定义的

此外:

不能将VirtualAllocdelete混合,就像不能将mallocdelete混合一样。

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;

使用new/delete或VirtualAlloc/VirtualFree。您正在分配两个独立的内存块,使用pFoo来引用这两个内存块(当然,它一次只能引用一个内存块),然后使用pFoo调用两个空闲函数。其中一个会失败:)