从QDataStream读取到QVector:应用程序崩溃并发出SIGABRT信号



崩溃并显示以下消息:

劣质停止,因为它收到来自操作系统的信号。

信号名称 : SIGABRT

信号含义:已中止

发生在以下代码行:

// data is QByteArray ...
QByteArray pos0  = data.mid( index, length );
/*
* Get float from byte-array
*/
QDataStream streamPos0(pos0);
QVector<float> floatPos0;
streamPos0 >> floatPos0; // Crash happens exactly at this line

我不知道为什么会发生崩溃。我想知道是否有人可以给我一个提示...


更新

我单步执行代码并在代码正好位于崩溃线时捕获本地值:

data    "fý¾¾PY01À21622433ÁµÏ4½20233µ½±½~¿f?ÿ¾@Q01Àî}33ÁµÏ4½20233µ½±½~¿f?ÿ¾ì07`¿10 35ÁµÏ4½20233µ½±½~¿zn~¾17?`¿´F35ÁØÙ00½Ó±µ½03Ý~¿zn~¾"... (846288)   QByteArray
index   0   int
length  12  quint64
pos0    "fý¾¾PY01À21622433Á"  QByteArray
streamPos0  @0x7fffffff7bb0 QDataStream
byteorder   QDataStream::BigEndian (0x0000) QDataStream::ByteOrder
d   (null)  QScopedPointer<QDataStreamPrivate>
dev @0x12f0d60  QIODevice
noswap  false   bool
owndev  true    bool
q_status    QDataStream::Ok (0x0000)    QDataStream::Status
ver 17  int
floatPos0   <0 items>

崩溃的确切位置在文件qdatastream.h中的这一行:

template <typename Container>
QDataStream &readArrayBasedContainer(QDataStream &s, Container &c)
{
StreamStateSaver stateSaver(&s);
c.clear();
quint32 n;
s >> n;
c.reserve(n); // crash happens exactly here
for (quint32 i = 0; i < n; ++i) {
typename Container::value_type t;
s >> t;
if (s.status() != QDataStream::Ok) {
c.clear();
break;
}
c.append(t);
}
return s;
}

我尝试通过.reserve().resize()方法为我的QVector<float> floatPos0分配大小,但没有帮助。


我正在使用Qt 5.9.4

我通过更改将字节数组转换为float数字的过程来避免 SIGABRT 崩溃。我用以下方法替换了不那么冗长但抛出SIGABRT信号的QDataStream方法。现在代码运行正常:

// Extracting chunks of float out of byte-array
QByteArray pos0x = data.mid( index                      , sizeof(float) );
QByteArray pos0y = data.mid( index + 1 * sizeof(float)  , sizeof(float) );
QByteArray pos0z = data.mid( index + 2 * sizeof(float)  , sizeof(float) );
// Converting to float
float floatPos0x;
if ( pos0x.size() >= sizeof(floatPos0x) ) {
floatPos0x = *reinterpret_cast<const float *>( pos0x.data() );
}
float floatPos0y;
if ( pos0y.size() >= sizeof(floatPos0y) ) {
floatPos0y = *reinterpret_cast<const float *>( pos0y.data() );
}
float floatPos0z;
if ( pos0z.size() >= sizeof(floatPos0z) ) {
floatPos0z = *reinterpret_cast<const float *>( pos0z.data() );
}

这篇文章很有帮助。

相关内容

  • 没有找到相关文章

最新更新