那么CopyMemory复制的字节多于VirtualAlloc分配的

时间:2017-04-12 08:02:13

标签: c++ windows virtualalloc copymemory

请查看此代码,在我的机器中,它不会引发错误,但我不明白为什么我可以复制比VirtualAlloc分配的更多字节,这个操作是否安全?

    PBYTE pNewBuffer = (PBYTE) VirtualAlloc(NULL,3,MEM_COMMIT,PAGE_READWRITE);
    BYTE FlagThree[] = {'a', 'b', 'c', 'd','e','f','g'};
    CopyMemory(pNewBuffer,FlagThree,sizeof(FlagThree));

我分配3个字节但复制到内存7个字节。

3 个答案:

答案 0 :(得分:2)

VirtualAlloc将您的分配四舍五入到最近的分配边界,因此尽管您要求3个字节,但实际上分配的更多,因为分配粒度为64K。

因此,您可以写出更多请求的3个字节。但是,如评论中所述,这是未定义的行为,您不应该这样做。

答案 1 :(得分:2)

这不是未定义的行为。实际上,它是完全定义的,因为文档明确指出"如果lpAddress参数为NULL,则此值(dwSize)向上舍入到下一页边界"。

因此,在您超出页面大小之前,它非常安全。

答案 2 :(得分:0)

虽然这个帖子的其他答案(整理)在这个特定情况下是完全正确的,但是你的问题让我认为你应该理解C ++所谓的未定义行为。

大多数 C ++中的其他情况下,与Java或C#等语言不同,做一些“糟糕”的事情。可能不会导致程序立即崩溃但导致它可能以奇怪的方式发生故障。或者按照您的预期运行。它只是没有定义什么会开心。阅读它。