程序问题,请指教!!

zhangwenlang 2010-03-25 03:01:00
DWORD WINAPI CChatDlg::RecvProc(LPVOID lpParameter)
{
char tempBuf[300];
recvfrom(...); //收到的字符存在tempbuf中,接着使用下面的语句发送一条消息给对话框。
::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);
}
PostMessage函数是立刻返回的,请问这时候tempBuff在RecvProc函数 退出前 WINDOWS有没有把里面的内容拷贝呢?向上面那样写有问题吗,代码出自孙鑫视频。请大家多多指教!!
...全文
127 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuzl32 2010-03-25
  • 打赏
  • 举报
回复
函数返回,局部变量销毁,指针指向的内容随时会被系统改写。这样做不安全。
断问天 2010-03-25
  • 打赏
  • 举报
回复
我认为异步调用的核心机制是多线程,异步调用函数将消息放入队列便立即返回,工作线程做完后会通知调用者,所以在堆上分配要传递的数据比较合理。
悠然红茶 2010-03-25
  • 打赏
  • 举报
回复
局部变量是在栈里,函数返回后,局部变量就不再有效了(其实就是栈顶寄存器变化了)。post事件内部不会负责帮你复制一个buffer副本的,它只会把消息的参数值记录下来,至于这个参数值所指代的东西是否存在,它是不管的。
cattycat 2010-03-25
  • 打赏
  • 举报
回复
这个会有问题的。PostMessage把消息放到消息队列后,就返回了,局部变量被释放了,你传递的是这个数组的指针,在消息处理函数中取数组的值肯定有问题。
用new的行,传递指针,在消息处理函数中delete这个指针就行。
happynxy 2010-03-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 aozhi 的回复:]

变成
static char tempBuf[300];
试试吧
[/Quote]这样不行,因为下次数据来的时候把buf就给冲掉了,楼主不能用局部变量,还是搞一个大点的统一的缓冲区存储收到的数据吧,要不就每次new个缓冲区出来,处理完消息后再delete[]
FrankSun80 2010-03-25
  • 打赏
  • 举报
回复
我觉得会出问题,所谓的立刻返回,是指windows把这个消息放入队列后就返回。这个参数是一个指针,好像PostMessage无法知道它所指的是什么对象以及对象的大小。所以PostMessage拷贝的也就是个指针。这样随后的消息处理函数中如果访问这个已经被释放的内存,其结果未定义~~

只是个人猜测,建议楼主测试!并把测试结果站内告诉我!
aozhi 2010-03-25
  • 打赏
  • 举报
回复
变成
static char tempBuf[300];
试试吧
xiuxianshen 2010-03-25
  • 打赏
  • 举报
回复
postmassage只是把消息发送到消息队列中,直到系统处理到这个消息的时候才会完全销毁tempbuffer吧
zhangwenlang 2010-03-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xianzq888 的回复:]
sendmessage才是立即返回的吧!
[/Quote]不是
  • 打赏
  • 举报
回复
sendmessage才是立即返回的吧!
zhangwenlang 2010-03-25
  • 打赏
  • 举报
回复
我认为虽然PostMessage立刻返回,此时RecvProc函数也结束,局部变量tempBuf被消毁,但在此之前系统已经把tempBuf里面的内容拷贝了,所以对程序的执行是没有影响的。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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