CopyMemory 复制的字节数比 VirtualAlloc 分配的字节多呢?

what about CopyMemory copy more bytes than VirtualAlloc allocated

本文关键字:字节 分配 VirtualAlloc 复制 字节数 CopyMemory      更新时间:2023-10-16

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

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

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

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

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

虽然这篇文章的其他答案(四舍五入(在这种特定情况下是完全正确的,但你的问题让我认为你应该理解C++所谓的未定义的行为。

与Java或C#等语言不同,在C++的大多数其他情况下,做一些"坏事"可能不会导致程序立即崩溃,但会导致它以奇怪的方式出现故障。或者只是按预期运行。它只是没有定义什么会快乐。请继续阅读。