首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >新建/delete[]和VirtualAlloc

新建/delete[]和VirtualAlloc
EN

Stack Overflow用户
提问于 2011-10-10 10:00:38
回答 3查看 1.7K关注 0票数 0
代码语言:javascript
复制
#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;
}

这对我来说是崩溃的

代码语言:javascript
复制
delete[] pFoo;

我知道这是因为VirtualAlloc崩溃,但我不确定如何解决这个问题…

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-10 10:02:49

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

在您使用VirtualFree释放它之后,指针就无效了。所以它上的delete是未定义的。

此外:

你不能把VirtualAllocdelete混用,就像你不能把mallocdelete混在一起一样。

票数 1
EN

Stack Overflow用户

发布于 2011-10-10 10:05:26

代码语言:javascript
复制
unsigned char* pFoo = new unsigned char[1000];

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

代码语言:javascript
复制
pFoo = (unsigned char*)VirtualAlloc(NULL, 1000, MEM_COMMIT, PAGE_EXECUTE_READWRITE);

这会覆盖旧指针,1000 char数组会泄漏。

尝试:

代码语言:javascript
复制
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;
票数 1
EN

Stack Overflow用户

发布于 2011-10-10 10:05:56

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7707876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档