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

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

  • 相关阅读:
    SQL学习
    FOR XML PATH
    IOS学习网址
    weak nonatomic strong等介绍(ios)
    UVALive3045 POJ2000 ZOJ2345 Gold Coins
    UVA713 UVALive5539 POJ1504 ZOJ2001 Adding Reversed Numbers
    UVA713 UVALive5539 POJ1504 ZOJ2001 Adding Reversed Numbers
    UVA439 POJ2243 HDU1372 ZOJ1091 Knight Moves【BFS】
    UVA439 POJ2243 HDU1372 ZOJ1091 Knight Moves【BFS】
    UVA10905 Children's Game
  • 原文地址:https://www.cnblogs.com/wnnily/p/5846719.html
Copyright © 2011-2022 走看看