在一个线程中新建并在另一个线程中删除,不允许?

时间:2011-04-09 21:58:00

标签: c++ multithreading

我正在从一个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所以我宁愿不为此添加一个。

2 个答案:

答案 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];