【发布时间】:2019-01-31 16:58:58
【问题描述】:
此消息导致崩溃:
下级停止了,因为它收到了来自操作系统的信号。
信号名称: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ý¾¾PY\001À\216\224\033ÁµÏ4½\020\233µ½±½~¿f?ÿ¾@Q\001Àî}\033ÁµÏ4½\020\233µ½±½~¿f?ÿ¾ì\007`¿\010 \035ÁµÏ4½\020\233µ½±½~¿z\n~¾\017?`¿´F\035ÁØÙ\000½Ó±µ½\003Ý~¿z\n~¾"... (846288) QByteArray
index 0 int
length 12 quint64
pos0 "fý¾¾PY\001À\216\224\033Á" 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
【问题讨论】:
-
当我尝试这段代码时它不会崩溃。请问您提供更多的细节,例如
data的实际内容,以及index和length。 -
@scopchanov 对。相信我会。我现在无法访问我的电脑。我会尽快发布详细信息。谢谢☺
-
我很期待。祝你有美好的一天!
-
@scopchanov 我用更多调试细节更新了帖子。谢谢:)
标签: qt sigabrt qvector qdatastream