zoukankan      html  css  js  c++  java
  • qstring转char*遇到的内存问题

    刚刚开始我是这么写的

    char* fun(QString data)
    {
    QByteArray byte = data.toLocal8Bit();
    char* charData = byte.data();
    return charData;
    }

    这样子写调用一次是可以的,不过多次调用后

    char* bb = fun("bbs");
    char* cc = fun("ccs");
    char* dd = fun("dds");
    char* ee = fun("ees");
    char* ff = fun("ffs");

    会导致前面的数据被后面的覆盖,到最后bb,cc,dd,ee的数据都会变成ffs

    究其原因,发现在fun函数中QByteArray 的地址一直没有发生变化,也就是每次调用fun函数的时候QByteArray 的地址是同一个,因为返回的是指针,所以后面来的数据就会把前面的数据覆盖掉,简单说就是bb,cc,dd,ee,ff指向同一个内存地址,这个内存地址放的内容不断被覆盖更新。QByteArray 这个变量其实在调用这个fun函数后就已经不存在了,可能是qt编译器优化后使得其指向同一个地址。而我们返回的是指向该变量成员函数data的指针,所以导致错误。

    所以我们只要让fun中的这个QByteArray每次调用的时候不一样,就可以了,由于函数里面的变量放在栈中,离开了其所在的{}就失效了,所以改用new,这样子就可以使得函数变量生成在堆中,然后手动释放,优化函数如下所示

    char* fun(QString data)
    {
    QByteArray* byte = new QByteArray(data.toLocal8Bit());
    char* charData = byte->data();
    return charData;

    }

    这样子我们就达到了预期的效果,但是最后要记得把new出来的东西delete掉,所以在每次调用改函数前把QByteArray 的地址保存在自己定义的QList<QByteArray*>中

    程序最后再把这些地址的内存调用delete逐一释放,避免内存泄漏。

    研究过程中我还试过了一个函数

    char* fun(QString data)

    {

    return data.toLocal8Bit().data();

    }

    理论上这个函数应该是可以的,因为每次调用该函数的时候data的地址是不一样的,但是打印出&data.toLocal8Bit()的地址是指向同一个的,这个可能qt编译器优化过,使得data.toLocal8Bit()的调用使得其自动生成一个QByteArray 对象导致的。

    浅薄之见,希望有高手读者指点一二

  • 相关阅读:
    找最大质因子问题
    ACM基础训练题解4302 丢失的牛
    ACM基础训练题解4301 城市地平线
    hnu 7/19 A Broken Audio Signal
    hnu7/20比赛 BUG 题解
    http://acm.hnu.cn/online/?action=problem&type=show&id=12817&courseid=267 7.19hnu/数据结构/数学 xxs.code
    SGU 解题报告
    2015 Multi-University Training Contest 1 题解&&总结
    HDU 5351 MZL's Border (规律,大数)
    SGU 239.Minesweeper
  • 原文地址:https://www.cnblogs.com/wnnily/p/5846719.html
Copyright © 2011-2022 走看看