C++ 如何释放使用fromRawData()创建的QByteArray
文件规定: QByteArray不拥有数据的所有权,因此QByteArray 析构函数永远不会删除原始数据,即使最后一次 引用数据的QByteArray被销毁 考虑到这一点,如何释放以这种方式创建的C++ 如何释放使用fromRawData()创建的QByteArray,c++,qt,memory-management,C++,Qt,Memory Management,文件规定: QByteArray不拥有数据的所有权,因此QByteArray 析构函数永远不会删除原始数据,即使最后一次 引用数据的QByteArray被销毁 考虑到这一点,如何释放以这种方式创建的QByteArray 从概念上讲,我想通过data()或constData()在指针上调用free(),但我真的不确定。。。下面是一个说明用例的代码示例: void doTest() { QByteArray qba = partOne(); partTwo(qba); fin
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());
}
如何释放以这种方式创建的QByteArray
这很简单,一个人没有。字节数组不拥有数据的所有权,因此不能将其从字节数组中“释放”
如果有必要释放数据,则该责任应由分配数据的代码承担。完成字节数组的操作后,不再存在对它的进一步引用
数据可能是“可释放的”,也可能不是“可释放的”,因此不应尝试将其从字节数组中释放。无论分配了什么机制,数据都应该处理其释放
memory allocation
byte array construction
byte array usage
byte array destruciton
memory deallocation
编辑:请记住,在阅读或写作过程中,“完成任务”和“完成任务”之间有很大的区别,因为在你写作的那一刻,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
}
如何释放以这种方式创建的QByteArray
这很简单,一个人没有。字节数组不拥有数据的所有权,因此不能将其从字节数组中“释放”
如果有必要释放数据,则该责任应由分配数据的代码承担。完成字节数组的操作后,不再存在对它的进一步引用
数据可能是“可释放的”,也可能不是“可释放的”,因此不应尝试将其从字节数组中释放。无论分配了什么机制,数据都应该处理其释放
memory allocation
byte array construction
byte array usage
byte array destruciton
memory deallocation
编辑:请记住,在阅读或写作过程中,“完成任务”和“完成任务”之间有很大的区别,因为在你写作的那一刻,COW开始工作,基础数据将被复制,更改将应用于它,而不是原始数据。自然,只有在多个字节数组实例隐式共享数据时才会发生这种情况,例如,数据将位于part2()
。如果您不希望发生这种情况,请通过引用而不是复制来传递。显然,如果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
}
fromRawData
没有所有权,所以内存应该由拥有需要释放的数据的对象来释放
从概念上讲-我想通过.data()或.constData()调用指针上的free(),但我真的不确定
这是不正确的,因为您不能保证QByteArray
不拥有数据。例如,如果修改QByteArray
的内容,将创建深度副本,该副本将由QByteArray
析构函数释放:
如果随后试图修改返回的QByteArray或其任何副本的内容,将导致它在进行修改之前创建数据数组的深度副本。这确保了原始数据数组本身永远不会被QByteArray修改
fromRawData
没有所有权,所以内存应该由拥有需要释放的数据的对象来释放
从概念上讲-我想通过.data()或.constData()调用指针上的free(),但我真的不确定
这是不正确的,因为您不能保证QByteArray
不拥有数据。例如,如果修改QByteArray
的内容,将创建深度副本,该副本将由QByteArray
析构函数释放:
如果随后试图修改返回的QByteArray或其任何副本的内容,将导致它在进行修改之前创建数据数组的深度副本。这确保了原始数据数组本身永远不会被QByteArray修改
您根本不需要手动管理内存:
QByteArray partOne() {
QByteArray qba(64, Qt::Uninitialized);
auto dataPtr = qba();
// use dataPtr
// do some stuff to qba
return qba;
}
您根本不需要手动管理内存:
QByteArray partOne() {
QByteArray qba(64, Qt::Uninitialized);
auto dataPtr = qba();
// use dataPtr
// do some stuff to qba
return qba;
}
这个页面上非常突出的例子是从<代码>静态conchchMyDAT[]]{< /C> >。您如何释放这个问题?这个问题是缺乏的,没有明确的陈述,为什么您要通过<代码> MalOC 分配内存。在C++代码中,它将是反模式。您知道代码> qBytEray::DATA()。< /Cord>方法是一种与需要原始指针的代码进行互操作的方法,对吗?考虑一个不分配内存的情况,而是从一个库中获得一个指向分配内存的指针,并且需要将该数据作为qBytErar传递给另一个-最好是不复制。Char MyDATAB[]= {<代码> >。这个问题是缺乏的,没有明确的说明,为什么你要通过<代码> MalOC 分配内存。在C++代码中,它将是一个反模式。你知道<代码> qBytEray::DATA():/Case>方法,作为与需要原始指针的代码交互的一种方式,