gpt4 book ai didi

c++ - 内存映射文件的奇怪行为,一些观察和一些问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:58:57 26 4
gpt4 key购买 nike

请看下面这段代码。

#include <windows.h>

void Write(char *pBuffer)
{
// pBuffer -= 4*sizeof(int);
for(int i = 0; i<20; i++)
*(pBuffer + sizeof(int)*i) = i+1;
}

void main()
{
HANDLE hFile = ::CreateFile("file", GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

if(INVALID_HANDLE_VALUE == hFile)
{
::MessageBox(NULL, "", "Error", 0);
return;
}

HANDLE hMMF = ::CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 32, NULL);

char *pBuffer = (char*)::MapViewOfFile(hMMF, FILE_MAP_WRITE, 0, 0, 0);

Write(pBuffer);

::FlushViewOfFile(pBuffer, 100);

::UnmapViewOfFile(pBuffer);
}

我只分配了 32 个字节,但当我尝试写入超过分配的大小时,我根本没有收到任何错误。这是设计使然还是 Windows 代码中的错误?但是,如果您包括注释部分,它会按预期给出错误。

我问这个是因为我正在考虑利用这个“功能”来发挥我的优势。我可以吗?仅供引用,我有 Win XP ver 2002 SP 3,但我怀疑这在较新的 Windows 中已“修复”,这可能会使我的代码 IDK 失败。任何解释其中一些内部结构的有用链接都会很有帮助。

谢谢

最佳答案

这与写入堆上分配的缓冲区末尾没有任何不同。如果您写入未映射的虚拟内存,操作系统只能打您的手指。映射是基于页面的,一页是 4096 字节。你必须写完这个页面才能获得 kaboom。将您的 for 循环更改为在 (4096+4)/4 处结束以重现它。

关于c++ - 内存映射文件的奇怪行为,一些观察和一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5370435/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com