2017-04-12 24 views
1

请看看这段代码,在我的机器,它不会引发错误,但我不明白为什么我可以复制比的VirtualAlloc分配更多的字节,这是操作安全吗?怎么样CopyMemory的复制比的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个字节。

+0

编号未定义的行为。 –

+0

你是什么意思“是否安全”?你问是否保证不会崩溃? –

+0

是的,测试后,似乎没有崩溃,但我不知道这个语句是否允许,VirtualAlloc的第二个参数的含义是这样说的:我可以使用这个参数的任何数字? – yangl

回答

2

VirtualAlloc回合你分配到最近分配的边界,所以虽然您申请3个字节,你居然会分配更多的分配粒度为64K。

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

2

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

所以直到超过页面大小,这是相当安全的。

0

虽然其他答案这个职位(四舍五入),在这种特殊情况下完全正确的,你的问题让我觉得你应该明白C++调用未定义behavoir。

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