首页
社区
课程
招聘
[求助]VirtualAlloc 分配内存 出错
发表于: 2012-4-11 17:36 5937

[求助]VirtualAlloc 分配内存 出错

2012-4-11 17:36
5937
LPSTR pData = (LPSTR)VirtualAlloc(NULL, dwSize, MEM_COMMIT, PAGE_READWRITE);

        ReadFile(hFile, (LPVOID)pData, dwSize, &dwBytesRead, NULL);

        CloseHandle(hFile);

        pData[dwSize] = '\0';

        int strLen = ::MultiByteToWideChar(CP_ACP, 0, pData, -1, NULL, NULL);

        LPWSTR pWData = (LPWSTR)VirtualAlloc(NULL, strLen, MEM_COMMIT, PAGE_READWRITE);

        MultiByteToWideChar(CP_ACP, 0, pData, strlen(pData), pWData, strLen);

我用上面的代码打开小文件没有问题 但是打开超过20K的文件就出问题了

LPWSTR pWData = (LPWSTR)VirtualAlloc(NULL, strLen, MEM_COMMIT, PAGE_READWRITE);
问题就是这里,但是我用 new 分配pWData内存空间一点问题也没有,这是为啥呀,
将宽字符的长度加大乘于2 VirtualAlloc分配没问题,按理来说 VirtualAlloc 分配这么点的内存没问题呀,难道第二次分配的和第一次分配重合了。。。。求帮助

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 128
活跃值: (27)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
分配内存 出错?你到底是程序崩溃了还是VirtualAlloc返回NULL还是什么呢?

pData[dwSize] = '\0';   溢出操作,VirtualAlloc的时候记得是dwSize+1
而且你pWData 的末尾还木有'\0',小心

这样的代码太不强壮了
2012-4-11 17:47
0
雪    币: 773
活跃值: (442)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
3
崩溃了,RING3 不咋地呀。。。 pWData 最后由CString 转换了 不加也行
2012-4-11 18:13
0
雪    币: 231
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
FileMapping ?
2012-4-11 18:54
0
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
多线程安全么。
2012-4-11 19:32
0
雪    币: 128
活跃值: (27)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
我说的关键是pData[dwSize] = '\0';这句,溢出操作了

而且我猜你应该至少得这么写

ReadFile(hFile, (LPVOID)pData, dwSize-1, &dwBytesRead, NULL);

pData[dwBytesRead] = '\0';
2012-4-11 23:00
0
雪    币: 773
活跃值: (442)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
7
不是这么写的问题 我上的那些代码都是我测试中更改后的,‘\0’我都加过,这就是个打开文本文件的,打开一般的文件都没有问题,就是打开一个超过2000行的文本出错了,用new 创建缓冲内存没事

LPSTR pData = (LPSTR)VirtualAlloc(NULL, dwSize+10, MEM_COMMIT, PAGE_READWRITE);
关键是这里你申请的内存 +10 也是错误

        //LPSTR pData = new char[dwSize + 1];

        LPSTR pData = (LPSTR)VirtualAlloc(NULL, dwSize + 1, MEM_COMMIT, PAGE_READWRITE);

        ReadFile(hFile, (LPVOID)pData, dwSize, &dwBytesRead, NULL);

        CloseHandle(hFile);

        pData[dwSize] = '\0';

        int wslen = ::MultiByteToWideChar(CP_ACP, 0, pData, dwSize, NULL, NULL);

        //LPWSTR pWData = new WCHAR[wslen + 1];

        LPWSTR pWData = (LPWSTR)VirtualAlloc(NULL, wslen + 1, MEM_COMMIT, PAGE_READWRITE);

        pWData[wslen] = '\0';

        MultiByteToWideChar(CP_ACP, 0, pData, dwSize, pWData, wslen);

上面注释的代码运行是正确的,我就是不明白 为什么用VirtualAlloc 分配会错误
2012-4-12 13:16
0
雪    币: 128
活跃值: (27)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
//LPWSTR pWData = new WCHAR[wslen + 1];

  LPWSTR pWData = (LPWSTR)VirtualAlloc(NULL, wslen + 1, MEM_COMMIT, PAGE_READWRITE);

  pWData[wslen] = '\0';又溢出了,哈哈。要VirtualAlloc(NULL, (wslen + 1)*2, …
2012-4-12 13:37
0
雪    币: 128
活跃值: (27)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
话说你崩溃的时候调试器不会 断在某个点吗?
难道你都不调试的?
2012-4-12 13:38
0
雪    币: 773
活跃值: (442)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
10
明白了 没想到 宽字符是*2的
谢谢了
2012-4-12 13:45
0
雪    币: 773
活跃值: (442)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
11
一直以为 int wslen = ::MultiByteToWideChar(CP_ACP, 0, pData, dwSize, NULL, NULL);得到的长度就是宽字符的长度
不过到现在还迷糊的是为什么打开小文件不报错呢
2012-4-12 13:48
0
游客
登录 | 注册 方可回帖
返回
//