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个字节。
答案 0 :(得分:2)
VirtualAlloc将您的分配四舍五入到最近的分配边界,因此尽管您要求3个字节,但实际上分配的更多,因为分配粒度为64K。
因此,您可以写出更多请求的3个字节。但是,如评论中所述,这是未定义的行为,您不应该这样做。
答案 1 :(得分:2)
这不是未定义的行为。实际上,它是完全定义的,因为文档明确指出"如果lpAddress参数为NULL,则此值(dwSize)向上舍入到下一页边界"。
因此,在您超出页面大小之前,它非常安全。
答案 2 :(得分:0)
虽然这个帖子的其他答案(整理)在这个特定情况下是完全正确的,但是你的问题让我认为你应该理解C ++所谓的未定义行为。
在大多数 C ++中的其他情况下,与Java或C#等语言不同,做一些“糟糕”的事情。可能不会导致程序立即崩溃但导致它可能以奇怪的方式发生故障。或者按照您的预期运行。它只是没有定义什么会开心。阅读它。