如何释放使用fromRawData()创建的QByteArray

时间:2016-12-04 16:20:07

标签: c++ qt memory-management

文档状态the following

  

QByteArray不接受数据的所有权,因此QByteArray   析构函数永远不会删除原始数据,即使是最后一个   引用数据的QByteArray被破坏了。

考虑到这一点,如何以这种方式释放QByteArray

从概念上讲 - 我猜测通过free()data()在指针上调用constData(),但我真的不确定......这是一个说明用例的代码示例:

void doTest() {
    QByteArray qba = partOne();
    partTwo(qba);
    finished(qba);
}

QByteArray partOne() {

    char *dataPtr = (char *)malloc(64);
    //do some stuff to dataPtr

    QByteArray qba = QByteArray::fromRawData(dataPtr, 64);
    //do some stuff to qba
    return qba;
}

void partTwo(QByteArray qba) {
    //do more stuff to qba
}

void finished(QByteArray qba) {
    //this?
    free((void *)qba.constData());
}

1 个答案:

答案 0 :(得分:0)

fromRawData不占用所有权,因此内存应该由拥有您需要释放的数据的对象释放。

  

从概念上讲 - 我猜测通过.data()或.constData()调用指针上的free(),但我真的不确定......

这是不正确的,因为您不能保证QByteArray不拥有数据。例如。如果您修改QByteArray的内容,则将创建深层副本,并且QByteArray析构函数将释放此副本:

  

随后尝试修改返回的QByteArray的内容或从中生成的任何副本将导致它在执行修改之前创建数据数组的深层副本。这确保了QByteArray永远不会修改原始数据数组本身。