【QT】-信号传输数组跨线程段错误处理
🔍 段错误根本原因
数据被提前释放
如果 data 是局部变量且接收端是 异步处理(如 QueuedConnection),可能在信号发射后 data 被销毁,但 Qt 试图在接收端拷贝它。
跨线程未正确复制
跨线程传递时,若未使用 Qt::QueuedConnection,接收线程可能访问发送线程已释放的内存。
信号槽未正确连接
接收对象已被销毁但连接未断开。
✅ 解决方案(分场景处理)
情况1:同线程内传递
cpp
// 确保 data 的生命周期覆盖接收端处理时间
QByteArray data = m_serialPort->readAll();
emit rawDataReceived(data); // 安全,隐式共享机制会避免拷贝
情况2:跨线程传递(必须显式深拷贝)
cpp
QByteArray data = m_serialPort->readAll();
// 方式1:使用 Qt::DirectConnection(仅当接收方在相同线程)
emit rawDataReceived(data);
// 方式2:跨线程时强制深拷贝
emit rawDataReceived(data.clone()); // C++17 或 Qt 5.15+
// 或
emit rawDataReceived(QByteArray(data)); // 构造新对象
情况3:确保接收方存活
cpp
// 检查接收对象是否有效
if (receiverObject) {
QByteArray dat