gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:14:06 24 4
gpt4 key购买 nike

文档状态 the following :

QByteArray does not take ownership of data, so the QByteArray destructor will never delete the raw data, even when the last QByteArray referring to data is destroyed.

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

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

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());
}

最佳答案

how does one free a QByteArray created in this way?

这很简单 - 一个人没有。字节数组不拥有数据的所有权,因此您不会从字节数组中“释放它”。

如果有必要释放数据,则该责任应落在分配数据的代码上。在您完成字节数组并且不存在对它的进一步引用之后。

数据可能是也可能不是“可释放的”,因此您不应该尝试从字节数组中释放它。分配数据的任何机制都应处理其释放。

memory allocation
byte array construction
byte array usage
byte array destruciton
memory deallocation

编辑:请记住 COW在阅读或写作时,“do stuff to”和“do stuff with”之间有很大的区别,因为在你编写的那一刻,COW 开始,底层数据将被复制,并且更改将应用​​于它,而不是原始数据。当然,只有当多个字节数组实例隐式共享数据时才会发生这种情况,例如它会在 partTwo() 中。如果您不希望发生这种情况,请通过引用而不是通过复制来传递。显然,如果 COW 启动,如果你从 data() 释放内存,那将是一个问题,因为你将释放字节数组分配的新内存,而你原来的分配将变成进入内存泄漏。因此,下面的解决方案针对这种可能性做出了规定。

void doTest() {
char *dataPtr = (char *)malloc(64);
//do some stuff to dataPtr
{
QByteArray qba = partOne(dataPtr);
partTwo(qba);
} // qba dies here
free(dataPtr);
}

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

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

关于c++ - 如何释放使用 fromRawData() 创建的 QByteArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40960738/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com