关于QString转string的堆异常

关于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了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值