QString以及QByteArray使用的注意点(主要针对内存的直接操作)

暂时以这两个类型为例。
这两个类型有着共同点,就是虽然是用来表示字符串或者是字节流的类,但是数据并不是直接存放在类内的,在其内部有个一个指向目标内存的指针,那个内存里面存放的才是真正的数据内容。

因此要注意一点,就是不能直接通过对于类本身的内存操作进行赋值,也不可以在还没有内存的时候,使用诸如memcpy的函数直接对于data()返回的内存进行操作。

来段代码测试一下,这里采用QByteArray来进行测试,代码如下:

void MainWindow::StringAndByteArrayTest()
{
    QByteArray arrTest;
    qDebug() << reinterpret_cast<long long>(arrTest.data());

    arrTest.append("slfjlas");
    qDebug() << reinterpret_cast<long long>(arrTest.data());

    arrTest.append("slfjlas");
    qDebug() << reinterpret_cast<long long>(arrTest.data());

    arrTest.append(1000, 'c');
    qDebug() << reinterpret_cast<long long>(arrTest.data());
}

这段代码的作用是为了对比QByteArray在有值以及无值的情况下内存地址的不同,以及在内存内容增加的情况下,其地址的变化情况 ,结果如下:
在这里插入图片描述
从上述演示结果可以发现:
QByteArray在有值和无值的情况下data()返回的地址是不同的(其实这里有个疑惑,就是在没有值的情况下,为什么返回的不是一个空指针,然后我就去追了源码,不过因为能力水平不够,追到后面已经看不懂了,就没继续追进去,抽空我再看看)。
另外一个就是,在存储的值比较大的情况下,会重新划分一块新的内存,然后将原先的值拷贝过来,并将新的地址的指针传递给QByteArray内部的Data指针,这点确实如我所料。

然后,示范一下错误的使用情况:

QByteArray arrTest;
int iNum = 666;
memcpy(arrTest.data(), &iNum, sizeof(int));

上述的代码明显就有这很大的问题,在声明arrTest的时候,因为没有数据,因此此时其内部的Data指针是不固定的,也就是野指针(姑且这么认为),此时如果执行memcpy函数,因为这个地址不对劲,所以在拷贝的时候可能会出问题。另外,在这个QByteArray的声明周期结束的时候,需要执行析构函数,这个时候也会出现问题(具体可以去追追源码),这就是我今天工作时候遇到的问题。
因此对于QByteArray 之类的内容,如果想要将之作为目的地址执行memcpy函数,一定要慎重,一定一定要慎重,一定要考虑到现在是否有值,以及这个值的大小是否越界

memcpy函数确实好用,但是所有涉及到内存的操作一定要注意地址是否正确,以及是否越界,一定要注意这一点,要不然会出现各种稀奇古怪的问题。
对于内存的操作一定要慎重,一定要注意是否合法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值