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,系统又报错,这改如何处理。
对于线程也有这样的问题,就是给线程传递一个指针,到底有线程删除指针,还是由主程序删除指针?谢谢!
pUserListDlg->PostMessage(WM_FILES_RECEIVE_SESSION_OPEN_MESSAGE, NULL, (LPARAM)c);//delete c;这里字符串c指针,使用Windows消息传给pUserListDlg,而且是异步方式。如果使用第3句把c指针删除,第2句有可能还没有执行完,这样应该不正确吧。但是如果在消息处理方法中得到传过来的c,再delete,系统又报错,这改如何处理。
对于线程也有这样的问题,就是给线程传递一个指针,到底有线程删除指针,还是由主程序删除指针?谢谢!
解决方案 »
- 关于内存释放的问题
- CTreeCtrl选中时,怎样才能改变其高度?
- 自定义多文档窗口创建问题
- 想写一个网页打印控件,请大家帮忙!重分!急!
- 打开文件报错
- SDK如何使用网络打印机?用打印机通用对话框OK么?有没有例子?
- 我再onsize里面从新定位控件的位置,结果控件都面目全非,加上一句invalidata(NULL)
- 还是一个关于API hook的问题(自己解决不了。。。。。。。。。。)
- 请问这两种方式的区别?
- 谁能解决闪烁的问题,我用GDI在对话框上操作但闪烁不停,每秒要更新数次,且在INVALIDATE时已经用了FALSE。
- 刚开始使用png//把png放到hdc里要如此之麻烦???
- LoadImage函数总是调用失败是怎么回事
不过既然是PostMessage,并且其他地方也不再使用的话,交给pUserListDlg去删除也是可以的.
sign-----------------------------------------------------------------------
以下是接收消息的处理函数,接收到传过来的字符串指针后,如果在这里释放,程序会报错。如果在主程序中释放,逻辑又不正确,该如何释放?
//接收文件,收到一个文件传输Session打开
LRESULT CUserListDlg::OnFilesRecevieSessionOpenMessage(WPARAM wParam, LPARAM lParam) {
char * msg = (char *) lParam;
AfxMessageBox("指针删除前");
delete msg; //执行此语句会报错
AfxMessageBox("指针删除后"); return 0;
}
如果就想用PostMessage,请大家看看有什么方法。问题就是使用PostMessage,在主程序中删除指针,在消息处理函数中删除指针都出错。
如果一定要用Post
如果一定要用PostMessage(),可以在接收这个消息的响应函数里,用完这个指针之后,通过SendMessage()回到new指针的线程里,让它的消息响应函数来负责delete(注意本帖的情况是new一个数组,要用delete[],不然内存泄漏)。如果这样还报错就没道理啦,还错的话你就rebuild all吧。。
析构函数 delete
{
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传的也是指针,我习惯用全局变量的对象,将对象的地址传进去。
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;
}