CopyMemory 复制比 VirtualAlloc 分配更多的字节怎么办
what about CopyMemory copy more bytes than VirtualAlloc allocated
请看这段代码,在我的机器上,它不会引发错误,但我不明白为什么我可以复制比分配的 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 个字节更多的字节。但是,如评论中所述,这是未定义的行为,您不应该这样做。
这不是未定义的行为。事实上,它是完全定义的,因为文档明确指出 "If the lpAddress parameter is NULL, this value (dwSize) is rounded up to the next page boundary".
因此,在您超过页面大小之前,这是非常安全的。
虽然此 post 的其他答案(汇总)在这种特定情况下是完全正确的,但您的问题让我认为您应该理解 C++ 所谓的未定义行为。
在大多数 C++ 中的其他情况不像Java 或C# 这样的语言,做一些事情'bad' 可能不会导致程序立即崩溃但会导致它可能以奇怪的方式发生故障。或者如您所料,只是 运行。它只是没有定义会发生什么。仔细阅读。
请看这段代码,在我的机器上,它不会引发错误,但我不明白为什么我可以复制比分配的 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 个字节更多的字节。但是,如评论中所述,这是未定义的行为,您不应该这样做。
这不是未定义的行为。事实上,它是完全定义的,因为文档明确指出 "If the lpAddress parameter is NULL, this value (dwSize) is rounded up to the next page boundary".
因此,在您超过页面大小之前,这是非常安全的。
虽然此 post 的其他答案(汇总)在这种特定情况下是完全正确的,但您的问题让我认为您应该理解 C++ 所谓的未定义行为。
在大多数 C++ 中的其他情况不像Java 或C# 这样的语言,做一些事情'bad' 可能不会导致程序立即崩溃但会导致它可能以奇怪的方式发生故障。或者如您所料,只是 运行。它只是没有定义会发生什么。仔细阅读。