正用CSocket&&CSokcetFile&&CArchive做多线程聊天程序,开辟接受发送两个线程,主线程中的cliSocket(继承自CSocket)负责数据中间转发——详细点说就是,当receive的时候,cliSocket中OnReceive()响应消息,调用接受线程的Receive函数,该函数中接受CString类型数据,然后调用::PostThreadMessage((DWORD)(GetMainWnd()->GetSafeHwnd()),WM_RECEIVE_MSG,(WPARAM)&msg,NULL);将该数据msg传回去给CliSocket的消息函数WM_RECEIVE_MSG,cliSocket再将它传给dlg(对话框).send的差不多。问题是在msg->flush()出现内存泄漏,听网上人说,postthreadmessage中的wParam不能接受字符串参数,那么应该怎么弄,将msg转化成字符数组再传吗??可能表述不清,请见谅。谢谢

解决方案 »

  1.   

    你得new出来一个CString对象,传递指针过去
      

  2.   

    PostThreadMessage会直接返回,可能导致传递的指针失效,所以要注意一下传递的CString的作用域。1的方法常见。
      

  3.   

    用post传结构需要new一个出来,再在处理时候delete掉的
      

  4.   

    只要你传递对象大于4字节,且不是全局变量,最好都new出来
    否则你肯难空值变量生命周期
      

  5.   

    自己一个例子:///////////////不用new
    //全局
    typedef struct
    {
    CString s;
    }temp;//主进程的函数中
    //在该类声明中
    temp test1;
    //在该类函数中
    test1.s="aaa";
    pSendThd->PostThreadMessage(WM_SEND,(UINT)&test1,NULL); ///////////////用new
    //全局
    typedef struct
    {
    CString s;
    }temp;//主进程的函数中
    //在该类声明中
    temp *test2
    //在该类函数中
    test2=new temp;
    test2->s="aaa";
    pSendThd->PostThreadMessage(WM_SEND,(UINT)test2,NULL); ////////////////////////////////////////////////////////////////////////
    第一种不可以吗??
    是否和数据生命期有关。
      

  6.   

    定义一个结构,传递它的地址过去
    指针=INT
      

  7.   


    第一个不行,你Post过去,得保证去方取的时候你的对象还存在
      

  8.   

    也就是test1存放在栈区,离开该函数即死亡。test2存放指向该类的一个成员变量的指针,该数据在这个类生存时一直存在。理解没错??