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

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

时间: 2024-10-09 22:51:57

qstring转char*遇到的内存问题的相关文章

QString转换为char*

QString在Qt里相当于C++里的std::string,或者是C里的c style string.不过,QString跟编码相关,在低层想把一个QString发送出去相当麻烦,尤其对方用的不是Qt的时候,必须先转化为char数组. QString转换为char数组,基本就是先将QString转换为QByteArray,再从QByteArray取得char *指针,就可以得到char类型的数据了.需要注意的是QString的编码. 假如为UTF8编码,则QString str("中国人&qu

Qt下QString转char*

Qt下面,字符串都用QString,确实给开发者提供了方便,想想VC里面定义的各种变量类型,而且函数参数类型五花八门,经常需要今年新那个类型转换 Qt再使用第三方开源库时,由于库的类型基本上都是标准的类型,字符串遇的多的就是Char*类型 在Qt下怎样将QString转char*呢,需要用到QByteArray类,QByteArray类的说明详见Qt帮助文档. 因为char*最后都有一个'/0'作为结束符,而采用QString::toLatin1()时会在字符串后面加上'/0' 方法如下: Qs

zz Qt下 QString转char*和char []

以下内容为转载:http://www.cnblogs.com/Romi/archive/2012/03/12/2392478.html ----------------------------------- Qt下面,字符串都用QString,确实给开发者提供了方便,想想VC里面定义的各种变量类型,而且函数参数类型五花八门,经常需要今年新那个类型转换 Qt再使用第三方开源库时,由于库的类型基本上都是标准的类型,字符串遇的多的就是Char*类型 在Qt下怎样将QString转char*呢,需要用到

Qt下 QString转char*

Qt下面,字符串都用QString,确实给开发者提供了方便,想想VC里面定义的各种变量类型,而且函数参数类型五花八门,经常需要今年新那个类型转换 Qt再使用第三方开源库时,由于库的类型基本上都是标准的类型,字符串遇的多的就是Char*类型 在Qt下怎样将QString转char*呢,需要用到QByteArray类,QByteArray类的说明详见Qt帮助文档. 因为char*最后都有一个‘/0’作为结束符,而采用QString::toLatin1()时会在字符串后面加上‘/0’ 方法如下: Qs

Qt QString转char*

一.QString str; char *ch; QByteArray ba = str.toLatin1(); ch = ba.data(); 二.将QString转换为标准库string类型,然后将string转为char * QString name; std::string cstr = name.toStdString(); consr char *ch = str.c_str();

QString unsigned char* 的转换

QString -> unsigned char* : QString str = "ABCD";  int length = str.length(); unsigned char* sequence = NULL;sequence =(unsigned char*)qstrdup(str.toAscii().constData()); delete[] sequence; - sequence length = 5 --> ['A'] ['B'] ['C'] ['D']

Qt下 QString转char*(转)

Qt下面,字符串都用QString,确实给开发者提供了方便,想想VC里面定义的各种变量类型,而且函数参数类型五花八门,经常需要今年新那个类型转换 Qt再使用第三方开源库时,由于库的类型基本上都是标准的类型,字符串遇的多的就是Char*类型 在Qt下怎样将QString转char*呢,需要用到QByteArray类,QByteArray类的说明详见Qt帮助文档. 因为char*最后都有一个'/0'作为结束符,而采用QString::toLatin1()时会在字符串后面加上'/0' 方法如下: Qs

QString 转 char*

1 QString str = QString("QString转换为char*"); 2 char *ch; 3 QByteArray ba = str.toUtf8(); 4 ch = ba.data(); QString 转 char*

QT QString与char *之间的转换 【转载】

原文网址:http://blog.csdn.net/candyliuxj/article/details/6429208 1.QString转char * 先将QString转换为QByteArray,再将QByteArray转换为char *. 注意:不能用下面的转换形式char *mm = str.toLatin1().data();.因为这样的话,str.toLatin1()得到的QByteArray类型结果就不能保存,最后转换,mm的值就为空. 2. char * 转QString 可以