我正在从一个com-port读取数据。由于我不知道数据何时到来,我正在连续阅读。
当我读取足够多的字节时,我通过发布带有指向字符串的指针的消息让主线程知道这一点:
msg[i] = '\0';
completeMsg = new char[i];
strcpy(completeMsg, msg);
PostMessage(hDlg, BT_MSG, NULL, (LPARAM) completeMsg);
i = 0;
主线程对此消息的响应是:
case BT_MSG:
{
char* msg = (char*) lParam;
ShowMsg(msg);
delete [] msg;
break;
}
但看起来不允许在此线程中删除,因为当我执行删除行时出现此错误:
Windows触发了一个断点 SPO.exe。
这可能是由于腐败造成的 heap,表示SPO.exe中的错误 或者它加载的任何DLL。
这也可能是由于用户造成的 在SPO.exe具有焦点时按F12。
输出窗口可能有更多 诊断信息。
我应该使用一些全局变量还是发回消息让read-thread处理删除?它没有消息循环atm所以我宁愿不为此添加一个。
答案 0 :(得分:4)
如果您链接到编译器的多线程运行时库,您应该能够在一个线程中使用new
而在另一个线程中使用delete
。
然而,看起来你实际上有一个缓冲区溢出。您使用msg
终止msg[i]=0
,但只分配i
字节 - 您可能需要new char[i+1]
。
答案 1 :(得分:2)
可以删除在另一个线程上分配的内存,假设所有内容都已正确同步。在您的情况下,您的COM端口线程在PostMessage之后不使用已分配的指针,因此在主线程上删除是正常的。
所以,我想知道你是否正在获得与线程无关的“正常”堆损坏。问题可能在于strcpy
,具体取决于i
的含义。请记住,strcpy
将写入终止空字符。你可能想要:
completeMsg = new char[i+1];