我希望在PostMessage中传递两个参数,一个是动态内存的指针,一个是int,代码如下:
void ReceiveProc()
{
char buf[1024];
int len; len = recv(MySocket,(char *)&buf,1024,0);
if(len)
{
char* pDataBuf = new char[len];
memcpy(pDataBuf,buf,1024);
::PostMessage(AfxGetMainWnd()->m_hWnd,WM_CLIENT_READCOLOSE,(WPARAM)pDataBuf,len);
}
return 0;
}在处理PostMessage中:
void CMainFrame::OnAcceptCloase(WPARAM wParam,LPARAM lParam)
{
    char dataBuf[1024];
    memset(dataBuf,0,1024);
    char *pDataBuf = (char *)wParam;
    unsigned long len = lParam;
    memcpy(dataBuf,pDataBuf,len);
    delete pDataBuf;
    ......
}
我希望在处理PostMessage消息中将消息copy出来,然后delete刚才动态申请的内存
但在执行到上面delete pDataBuf后程序出现异常。
不知道为什么?

解决方案 »

  1.   

    memset(pBuf , 0 , 1024);
    char *p = (char *)msg.wParam;
    memcpy(pBuf , p , strlen(p));
    delete p;这是我以前写的程序的内容,没有任何问题,我想错误不是出在这里,你看看你的下文有没有用到pDataBuf的地方,或者你把pDataBuf删除掉看看还会有异常么?
      

  2.   

    我怀疑是你的访问pDataBuf时候,memcpy(dataBuf,pDataBuf,len);越界了,你试着少一些数据拷入,比如把len改为小于1024的数字.
      

  3.   

    len = recv(MySocket,(char *)&buf,1024,0);//第二参数该是(char *)buf
    if(len)
    {
    char* pDataBuf = new char[len];
    memcpy(pDataBuf,buf,1024);//len的长度未必是1024,可能更小...:memcpy(pDataBuf, buf, len ) ;
    delete pDataBuf;//似乎该用 delete [] pDataBuf ;
      

  4.   

    好像都不是你们上边说的原因。
    我已经改过memcpy(pDataBuf,buf,1024)为memcpy(pDataBuf,buf,len)。
    但还是在delete pDataBuf这句程序出异常。
    如果我不执行这句,那程序一切ok,但我这句是必须要执行的啊,否则就会有内存泄漏啊!
      

  5.   

    同意 QunKangLi(李群康)  的说法。
    但是我建议你这样发送消息:::SendMessage(AfxGetMainWnd()->m_hWnd,WM_CLIENT_READCOLOSE, len, (LPARAM)pDataBuf);
      看起来你是在一个线程里向主程序发送消息哦。如果你实在搞不定的话,就改一下算法吧。
    比如,你把接受到的数据放在全局变量中,用同步来实现。呵呵,个人看法而已。