最近在写Qt程序,用到了QString类的toLocal8Bit方法,写法如下:
const char* pStr = str.toLocal8Bit().data();
fun(pStr);
结果并没有得到自己想要的答案,看起来使用挺简单的,也没啥错误啊,咋就是不对呢,想不通,第一反应就是去百度吧,好在有不少人也和我一个档次,很愉快地搜到了答案:
fun(str.toLocal8Bit().data());
理由也给出来了,就是toLocal8Bit()返回的是一个QByteArray临时对象,然后pStr保存了临时对象的地址,当然就不对了,这个大部分人都能看懂,没问题。
重点不是这个,重要的是自己当时为啥没有第一反应去思索哪里不对,而是首先想到了百度呢。其实只要稍微思考下,一个函数返回了指针,要么就是堆上,要么就是栈上。第一种写法,我们默认返回的指针就是在堆上,否则肯定会报错,但是该函数返回的指针在堆上的话,那跑不了是要自己释放的,但是去QString类中并没有提供类似的方法,所以推测返回的是栈上的指针。然后自己尝试下第二种写法,就能很快找出问题的所在。
从这个使用问题来看,很多东西并不能用不熟悉来做借口,或者说看到不熟的总是害怕,很多东西背后的原理都是相通的,只要简单地多思考一步,就能知道背后的原因所在了。