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

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

  • 相关阅读:
    html页面小技巧
    文件上传动态获取文件名
    thymeleaf之下拉框回显选中
    地图/导航控件哪家强?DevExpress WPF v19.2帮你忙
    Web UI开发神器—Kendo UI for jQuery数据管理之过滤操作
    开启.NET Core 3时代,DevExpress v19.2.5带你全新启航
    DevExpress WPF 2020全新出发,功能计划蓝图一览
    2020还有9天!Winforms开发有哪些期待?DevExpress 2020计划出炉
    Web UI开发神器—Kendo UI for jQuery数据管理网格编辑操作
    甘特图、Data Editors控件新玩法—DevExpress WPF v19.2
  • 原文地址:https://www.cnblogs.com/wnnily/p/5846719.html
Copyright © 2011-2022 走看看