CopyMemory拷贝比VirtualAlloc分配的更多的字节

请看这个代码,在我的机器上,它不会引起错误,但我不明白为什么我可以复制比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个字节。

VirtualAlloc把你的分配四舍五入到最近的分配边界,所以尽管你要求3个字节,但实际上分配的粒度是64K。

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

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

所以,直到你超过页面大小,这是非常安全的。

虽然这个帖子的其他答案(总结)在这个特定的情况下是完全正确的,但是你的问题让我觉得你应该明白C ++调用undefined的行为。

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