我的程序是否因为在一个线程中使用new而在另一个线程中使用delete而被中断?

Is my program being interrupted because I use new in one thread and delete in another?

本文关键字:线程 另一个 程序 delete 中断 new 因为 一个 我的 是否      更新时间:2023-10-16

我正在从comcomport读取数据。因为我不知道数据何时到来,所以我在线程中连续读取。

当我已经读取了足够的字节,我让主线程知道这通过发布一个消息与一个指针的字符串:

msg[i] = '';
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;
}

但是看起来在这个线程中删除是不允许的,因为当我执行delete-line时,我得到了这个错误:

Windows触发了一个断点SPO.exe .

这可能是由于heap,表示SPO.exe中存在错误

这也可能是由于用户在spop .exe有焦点时按F12

输出窗口可能有更多诊断信息。

我应该使用一些全局变量或发送消息返回让读线程处理删除?它没有消息循环,所以我不想为这个添加一个。

你应该能够在一个线程中使用new,在另一个线程中使用delete,只要你链接到编译器的多线程运行库。

然而,看起来你实际上有一个缓冲区溢出。您用msg[i]=0终止msg,但只分配i字节—您可能需要new char[i+1]

删除在另一个线程上分配的内存是可以的,假设一切都是正确同步的。在您的情况下,您的COM端口线程不使用PostMessage之后分配的指针,因此在主线程上删除是可以的。

所以,我想知道你是否得到了一个与线程无关的"正常"堆损坏。问题可能与strcpy有关,具体取决于i的含义。请记住,strcpy将写入结束null字符。您可能需要:

completeMsg = new char[i+1];