关于QString转string的堆异常
IDE是基于QT4.7(其他平台暂时没有测试)。在进行字符串转换时调用toStdString()进行转换出现了堆异常,代码如下:
QString Q_str("hello");
string S_str;
S_str = Q_str.toStdString();
程序运行到这里就会崩溃,提示说可能是堆被损坏。于是在网上寻找其出现错误的原因,然后结合自己的理解分享出来,如果有不对的地方还请解惑。
通过查找资料发现toStdString()在进行QString转换到string时会构建临时对象来存储数据,也就是说toStdString()返回的时临时地址,临时地址只在本行有效,程序往下运行之后就被释放了。那么程序提示堆错误的原因也就在这里:可以发现在执行赋值语句之前,S_str对象已经被创建了,它已经被系统分配空间,然后执行下面的赋值语句。string类型的变量在进行赋值时会delete之前的空间,重新new一个空间。这样就很好理解了:
S_str = Q_str.toStdString();会执行三个步骤:首先进行delete,然后进行new,最后把数据放到new的内存里。而toStdString()只是临时对象,在S_str搬运数据的时候,该地址已经被系统回收了,因此S_str访问的是非法内存地址,就会出现堆错误信息了。
基于以上原因,只需要对程序做稍微的修改即可,在创建S_str的构造函数里进行赋值:
QString Q_str("hello");
string S_str = Q_str.toStdString();
这样虽然toStdString()是临时地址,但是在S_str构造函数里会创建局部变量来复制该地址里的数据,相当于toStdString()的生命周期延续到S_str构造函数结束的时候,这样就可以避免上述的bug了。