新建/删除[]和VirtualAlloc

时间:2011-10-10 02:00:38

标签: c++ memory new-operator delete-operator virtualalloc

#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 个答案:

答案 0 :(得分:1)

你正在使用相同的变量。所以你的第一次分配就会泄露。

使用VirtualFree释放后,指针无效。因此,delete未定义。

此外:

您不能混用VirtualAllocdelete,原因与mallocdelete混合的原因相同。

答案 1 :(得分:1)

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;

答案 2 :(得分:1)

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