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 个字节复制到内存中。
这不是未定义的行为。事实上,它是完全定义的,因为文档明确指出"如果 lpAddress 参数为 NULL,则此值 (dwSize( 将向上舍入到下一页边界"。
因此,在您超过页面大小之前,它是非常安全的。
VirtualAlloc 将您的分配四舍五入到最近的分配边界,因此,尽管您请求的是 3 个字节,但实际上会分配更多,因为分配粒度为 64K。
因此,您可以写入比您请求的 3 个字节更多的内容。但是,正如评论中提到的,这是未定义的行为,您不应该这样做。
虽然这篇文章的其他答案(四舍五入(在这种特定情况下是完全正确的,但你的问题让我认为你应该理解C++所谓的未定义的行为。
与Java或C#等语言不同,在C++的大多数其他情况下,做一些"坏事"可能不会导致程序立即崩溃,但会导致它以奇怪的方式出现故障。或者只是按预期运行。它只是没有定义什么会快乐。请继续阅读。
相关文章:
- 为什么动态分配的内存总是16字节对齐
- 如何使用 new in C++ 分配字节数内存
- 动态分配 8 字节的内存
- 为什么 new 第一次分配 1040 个额外的字节?
- CopyMemory 复制的字节数比 VirtualAlloc 分配的字节多呢?
- 为什么分配的变量地址之间相差 16 个字节?
- Valgrind:将一个指针分配给另一个指针后丢失字节
- 如果Malloc无法分配X字节,我应该使用Realloc还是再次使用Malloc?C++
- 将分配的前 16 个字节的内存强制转换为 UDT
- 如何使用调用和分配指令在 llvm 字节码中查找类名
- 我正在尝试在类中动态分配静态字节板[67]
- 分配大小无效:4294967295 字节
- 无效的free() / delete / delete[] / realloc(), 4 字节在大小为 16 的块内分配
- c++堆分配默认为32字节对齐
- new分配了多少字节
- 为什么 2^80 字节的内存分配不会失败?
- C++强制 new[] 不分配 4 个额外的字节
- 通过取消引用指向字节数组的指针来分配值是错误的吗?
- C++ 分配期间 NaN 字节表示形式发生变化
- C++指针分配不起作用(关闭34个字节)