一个微软demo的坑。是内存分配不一样,还是GetLastError的坑?还是其他的坑???

唯恐天下不乱 2018-09-05 07:17:10
问题来自于微软的一个例子。
改了一些代码,发现运行结果就完全不一样了。
https://docs.microsoft.com/zh-cn/windows/desktop/ipc/named-pipe-server-using-overlapped-i-o

PIPEINST Pipe[INSTANCES];
这一句原来为全局变量。
我改为main函数里的局部变量。(还要改DisconnectAndReconnect就不细说了)
这时候就发现在下面case READING_STATE:下面的wErr = GetLastError();
就发生了改变,原来返回997,改为局部变量之后就变成了87。

-
为此又分别做了其他的尝试

   PIPEINST* Pipe = (PIPEINST*)GlobalAlloc(GPTR, sizeof(PIPEINST)*INSTANCES);   // success
PIPEINST* Pipe = new PIPEINST[INSTANCES](); // failed
PIPEINST* Pipe = (PIPEINST*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(PIPEINST)*INSTANCES); // success
PIPEINST* Pipe = (PIPEINST*)LocalAlloc(LPTR, sizeof(PIPEINST)*INSTANCES); // success
PIPEINST* Pipe = (PIPEINST*)malloc(sizeof(PIPEINST)*INSTANCES); //failed


匪夷所以,是内存分配的问题?
GetlastError的问题?
还是其他的问题?
...全文
152 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
NexTor 2018-09-06
  • 打赏
  • 举报
回复
感觉像是内存分配的原因吧,
从你的结果看new和malloc都失败了,而其他的是成功的,他们的区别中有一点是malloc和new的一般实现都是编译器的运行库管理的堆中分配内存,而不是系统的堆内存分配内存,我感觉是不是因为malloc是运行库管理的内存所以失败呀。
唯恐天下不乱 2018-09-06
  • 打赏
  • 举报
回复
不注意审题啊。
都说了是内存分配导致的问题。
997是正常的错误值。
87是错误的,是因为一开始的内存位置不一样。
解决方法也已经找到,代码也已经贴出来了。
只是不明白为什么这样而已。


引用 1 楼 Slzde_sub 的回复:
那就查找错误啊,把错误代码值输进去,看看是报的什么错

我帮你看了下,997是重叠io操作在运行中,87是参数错误

代码我就不看了,没有超链接。。正好我也没有鼠标

美的美德

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧