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 对象导致的。

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

  • 相关阅读:
    jenkins之配置构建执行
    神器sublime02-编写python
    神器sublime02-连接github提交代码
    神器sublime01-基础使用
    阿里云部署opms用于练习自动化
    Spark性能优化之道——解决Spark数据倾斜(Data Skew)的N种姿势
    修改Flume-NG的hdfs sink解析时间戳源码大幅提高写入性能
    Hbase 布隆过滤器BloomFilter介绍
    Hadoop创始人Doug Cutting寄语2017:五种让开源项目成功的方法
    HBase在数据统计应用中的使用心得
  • 原文地址:https://www.cnblogs.com/wnnily/p/5846719.html
Copyright © 2011-2022 走看看