C++ 临时变量的析构

论坛 期权论坛 期权     
跟田老师学C++   2019-7-8 05:45   3245   0
   
Qt 中经常会使用
  1. QString::toUtf8()
复制代码
获取字符串的 UTF-8 数组,例如下面这样使用:
1234void foo(const char *data) { ... }const char *data = QString::toUtf8().constData();foo(data);看上去没啥问题,其实这个代码有很严重的问题,一般不是经验很丰富的程序员很难发现这个 Bug,很可能会导致程序崩溃退出,但就是找不到为什么。这是因为
  1. QString::toUtf8()
复制代码
返回的是一个 QByteArray 的栈变量,第 3 行语句中的 QByteArray 是一个临时变量,这行语句结束时这个变量就被析构了,指针 data 指向的内存也被回收,所以下面使用的 data 指向的内存已经被释放了,难怪程序会崩溃了。把代码修改为下面的样子则就能够正确运行了:
1234567// [1]foo(QString::toUtf8().constData()); // 很奇怪是不是?// [2] 先保存 baQByteArray ba = QString::toUtf8();const char *data = ba.constData();foo(data);这个问题涉及到临时变量的析构,也许还不太明白是怎么回事,下面的程序就来模拟上面的情况,一看就明白了:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051#include class B {public:    B() {        qDebug()
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:5
帖子:1
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP