1

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

4

3 回答 3

3

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

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

于 2017-04-12T09:20:37.197 回答
2

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

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

于 2017-04-12T09:13:54.407 回答
0

虽然这篇文章的其他答案(汇总)在这种特定情况下是完全正确的,但您的问题让我认为您应该了解 C++ 所谓的未定义行为。

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

于 2017-04-12T09:29:17.213 回答