囧,被 QString 调戏了一下午.

2018-06-12 16:49:14 +08:00
 zone53

用 QT 的 Sqlite 将一个 struct 以二进制的方式存到 db 中,结果在读取 db 后,程序总是卡死,程序异常结束。

一开始以为是数据库读写有问题,后来发现不是.

接着比对二进制写入的数据与读取的数据是否一致,结果是一致的.

然后我就疯掉了.搞不清问题在哪里,QT 也不报错,就是卡死,程序异常结束。

再接着,只能是一行一行加调试信息,发现,db 读取后,要用 struct 变量的时候卡死了.

接着懵逼....

然后不知咋地,突然想到 struct 内有个 QString 变量,改成 char 后,解决了...

庆幸我找到了这个点,虽然还不清楚原理.要不然我要把一堆参数一个个写到数据库了...

有没有大神解释下

大概代码:

typedef struct
{
    QString a;
    int b;
    double c;
}Test;

// save
Test write;
QByteArray param((char*)&write, sizeof(Test));
sql_save(param);

// read
Test read;
QByteArray param_r;
sql_read(&param_r);
memcpy(&read, param_r.data(), sizeof(Test));
qDebug() << read.a;		// <- 在 memcpy 后,这句就卡死了..
3978 次点击
所在节点    Qt
1 条回复
KaoN
2018-06-15 21:23:28 +08:00
QString 不是 POD type 的。。你这样 memcpy 肯定有问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/462518

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX