V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zone53
V2EX  ›  Qt

囧,被 QString 调戏了一下午.

  •  
  •   zone53 · 2018-06-12 16:49:14 +08:00 · 4087 次点击
    这是一个创建于 2363 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用 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 后,这句就卡死了..
    
    1 条回复    2018-06-15 21:23:28 +08:00
    KaoN
        1
    KaoN  
       2018-06-15 21:23:28 +08:00
    QString 不是 POD type 的。。你这样 memcpy 肯定有问题
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2704 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:25 · PVG 20:25 · LAX 04:25 · JFK 07:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.