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

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

原文地址:https://www.cnblogs.com/wnnily/p/5846719.html