【问题标题】:New/delete[] and VirtualAlloc新建/删除[] 和 VirtualAlloc
【发布时间】:2011-12-04 04:56:15
【问题描述】:
#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++ memory new-operator delete-operator virtualalloc


    【解决方案1】:

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

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

    此外:

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

    【讨论】:

    • 所以它只是 VirtualFree(pFoo, 0, MEM_RELEASE);够了吗?
    • 嗯,主要问题是你有两个不同的分配到同一个变量。第二次分配将覆盖第一次分配的指针。然后你尝试释放/释放它两次。
    • 能解释一下你想用两个分配来完成什么吗?或者你可能误会了什么?
    • 谢谢!我明白了,现在不需要新的了。
    【解决方案2】:
    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】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-12
        • 1970-01-01
        • 1970-01-01
        • 2014-11-19
        • 1970-01-01
        • 2020-11-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多