0
#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 而崩溃,但我不知道如何解决这个问题......

4

3 回答 3

1

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

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

此外:

您不能混合VirtualAllocdelete出于同样的原因,您不能malloc与混合delete

于 2011-10-10T02:02:48.790 回答
1
unsigned char* pFoo = new unsigned char[1000];

现在pFoo持有一个指向动态内存的指针。

pFoo = (unsigned char*)VirtualAlloc(NULL, 1000, MEM_COMMIT, PAGE_EXECUTE_READWRITE);

这覆盖了旧指针,1000char数组被泄露。

尝试:

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;
于 2011-10-10T02:05:25.703 回答
1

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

于 2011-10-10T02:05:55.530 回答