从 QDataStream 读取到 QVector:应用程序因 SIGABRT 信号而崩溃
Reading from QDataStream to QVector: application crashes with SIGABRT signal
此消息导致崩溃:
The inferior stopped because it received a signal from the operating system.
Signal name : SIGABRT
Signal meaning : Aborted
发生在这行代码:
// 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ý¾¾PY[=11=]1À643ÁµÏ4½03µ½±½~¿f?ÿ¾@Q[=11=]1Àî}3ÁµÏ4½03µ½±½~¿f?ÿ¾ì[=11=]7`¿0 5ÁµÏ4½03µ½±½~¿z\n~¾7?`¿´F5ÁØÙ[=11=]0½Ó±µ½[=11=]3Ý~¿z\n~¾"... (846288) QByteArray
index 0 int
length 12 quint64
pos0 "fý¾¾PY[=11=]1À643Á" 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 崩溃。我用以下方法替换了 QDataStream
方法,该方法不那么冗长,但会抛出 SIGABRT 信号。现在代码运行正常:
// 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() );
}
This post 很有帮助。
此消息导致崩溃:
The inferior stopped because it received a signal from the operating system.
Signal name : SIGABRT
Signal meaning : Aborted
发生在这行代码:
// 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ý¾¾PY[=11=]1À643ÁµÏ4½03µ½±½~¿f?ÿ¾@Q[=11=]1Àî}3ÁµÏ4½03µ½±½~¿f?ÿ¾ì[=11=]7`¿0 5ÁµÏ4½03µ½±½~¿z\n~¾7?`¿´F5ÁØÙ[=11=]0½Ó±µ½[=11=]3Ý~¿z\n~¾"... (846288) QByteArray
index 0 int
length 12 quint64
pos0 "fý¾¾PY[=11=]1À643Á" 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 崩溃。我用以下方法替换了 QDataStream
方法,该方法不那么冗长,但会抛出 SIGABRT 信号。现在代码运行正常:
// 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() );
}
This post 很有帮助。