C++ 如何释放使用fromRawData()创建的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不拥有数据的所有权,因此QByteArray 析构函数永远不会删除原始数据,即使最后一次 引用数据的QByteArray被销毁

考虑到这一点,如何释放以这种方式创建的
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>方法,作为与需要原始指针的代码交互的一种方式,