char *c = new char[s.GetLength()];

pUserListDlg->PostMessage(WM_FILES_RECEIVE_SESSION_OPEN_MESSAGE, NULL, (LPARAM)c);//delete c;这里字符串c指针,使用Windows消息传给pUserListDlg,而且是异步方式。如果使用第3句把c指针删除,第2句有可能还没有执行完,这样应该不正确吧。但是如果在消息处理方法中得到传过来的c,再delete,系统又报错,这改如何处理。
对于线程也有这样的问题,就是给线程传递一个指针,到底有线程删除指针,还是由主程序删除指针?谢谢!

解决方案 »

  1.   

    我感觉可以在这个窗口退出的时候delete,或者直接建一个变量,然后传这个变量的地址过去。
      

  2.   

    一般情况下,是谁申请、创建,就由谁释放、删除
    不过既然是PostMessage,并且其他地方也不再使用的话,交给pUserListDlg去删除也是可以的.
    sign-----------------------------------------------------------------------

      

  3.   

    在消息接收的地方,处理完之后删除,new出搂的变量在堆里,在其它线程删除是没有问题。如果怕的话就用智能指针,可以很明显的告诉你内存什么时候被删除了。
      

  4.   

    问题补充:
    以下是接收消息的处理函数,接收到传过来的字符串指针后,如果在这里释放,程序会报错。如果在主程序中释放,逻辑又不正确,该如何释放?
    //接收文件,收到一个文件传输Session打开
    LRESULT CUserListDlg::OnFilesRecevieSessionOpenMessage(WPARAM wParam, LPARAM lParam) {
    char * msg = (char *) lParam;
    AfxMessageBox("指针删除前");
    delete msg; //执行此语句会报错
    AfxMessageBox("指针删除后"); return 0;
    }
      

  5.   

    delete[] msg 依然出错
      

  6.   

    尝试SendMessage,指针C函数结束已经释放了
      

  7.   

    你在所谓的主程序那边delete了,当然在自定义消息的响应函数里面就不能delete了,而且如果是用postmessage的话,你那LPARAM是0xffffff.因为局部变量已经木有了。如楼上所说用SendMessage,等待消息响应处理完。delete只在所谓的主程序那里就OK了。
      

  8.   

    你上面的那段代码是在dll中?
      

  9.   

    用SendMessage,等待消息响应处理完。然后在主程序中使用delete删除指针,这样解决没有问题。
    如果就想用PostMessage,请大家看看有什么方法。问题就是使用PostMessage,在主程序中删除指针,在消息处理函数中删除指针都出错。
      

  10.   

    我想问问,报什么错哦?
    如果一定要用Post
      

  11.   

    我擦,CSDN改版后,已经第二次因为按了Ctrl+Enter误提交了!我想问问,报什么错哦?
    如果一定要用PostMessage(),可以在接收这个消息的响应函数里,用完这个指针之后,通过SendMessage()回到new指针的线程里,让它的消息响应函数来负责delete(注意本帖的情况是new一个数组,要用delete[],不然内存泄漏)。如果这样还报错就没道理啦,还错的话你就rebuild all吧。。
      

  12.   

    我好像没看见new,delete不是要和new配对使用吗?
      

  13.   

    在构造函数是 初始对象。 使用时new
    析构函数 delete
      

  14.   

    void CThreadTestDlg::OnBnClickedButtonPostmessage()
    {
    char* c = new char[128];
    this->PostMessage(WM_TEST, NULL, (LPARAM)c);
    // delete [] c;
    }LRESULT CThreadTestDlg::OnPostMessage(WPARAM wParam, LPARAM lParam)
    {
    char* msg = (char*)lParam;
    delete [] msg;
    return S_OK;
    }
    仅仅是以上代码,无论放在哪里delete都不会报错,如果还报错可能是其它代码造成的?
    可否贴出来?
    在OnBnClickedButtonPostmessage里delete,有可能消息函数中使用变量的时候就会报错。
    解决方法暂时有三个:
    1.使用同步,但是看你硬要用postmessage这个可以不考虑了
    2.如果确定其它地方没有用的话,那可以放在消息函数中delete。
    3.postmessage之后的代码char* c变量的值是不确定的,不能使用,所以可以干脆就放在消息函数中声明和删除。至于线程,反正PostThreadMessage传的也是指针,我习惯用全局变量的对象,将对象的地址传进去。
      

  15.   

    确定不会被使用了就delete.......
      

  16.   

    消息处理程序的代码如下://接收文件,收到一个文件传输Session打开
    LRESULT CUserListDlg::OnFilesRecevieSessionOpenMessage(WPARAM wParam, LPARAM lParam) {
    char * msg = (char *) lParam; UuTcpMessageParser uuTcpMessageParser; CString fromHostIp = uuTcpMessageParser.parseValue(msg, "fromHostIp");
    CString filesTotalSize = uuTcpMessageParser.parseValue(msg, "filesTotalSize");
    //AfxMessageBox("接收文件总大小:"+filesTotalSize); if (fromHostIp!=""&&fromHostIp.GetLength()>0) {
    //弹出文件接收对话框
    CChartDlg *chartDlg;
    BOOL exist = System::chartDlgMap.Lookup(fromHostIp, ( CObject*& )chartDlg);
    if (!exist) {
    chartDlg = new CChartDlg();
    chartDlg->m_UserHostIp = fromHostIp;
    chartDlg->Create(IDD_DIALOG_CHART_WND, this); //创建对话框
    System::chartDlgMap.SetAt(fromHostIp, ( CObject*& )chartDlg);
    } chartDlg->ShowWindow(SW_SHOW); //显示对话框
    chartDlg->m_ReceiveFilesProgressCtrl.SetRange32(0, atoi(filesTotalSize));
    } AfxMessageBox("指针删除前");
    //delete[] msg; //此处不注释就出错。使用delete msg也出错。
    AfxMessageBox("指针删除后"); return 0;
    }