QByteArray :: append()导致内存重新分配

时间:2015-09-18 04:16:43

标签: c++ qt dynamic-memory-allocation qbytearray

我注意到在某些情况下执行以下代码后

void appendToArray(QByteArray &array, const char *source, int size) {
    void *p1 = array.data();
    array.append(dest, size);
    void *p2 = array.data();
}
p1和p2变得不同了。但我一直认为append()方法不会影响内部QByteArray内存"开头#34; - 它只是将一些字节附加到对象的末尾;我错了吗?

3 个答案:

答案 0 :(得分:4)

来自QByteArray文档页面(http://doc.qt.io/qt-4.8/qbytearray.html

  

当您将数据追加到非空数组时,数组将是   重新分配并将新数据复制到其中。

这可能不会一直发生,因为阵列可能有足够的内存分配来存储新项目。但是,当需要获得更多空间来存储更多数据时,它会为整个阵列重新分配内存并复制现有数据。这样它可以维护一个连续的数据数组。

答案 1 :(得分:1)

最好不要假设指针不会在append()上改变。

QByteArray在数据之后预分配一些空间,但是在数量超过之后,它使用realloc,它可以或不能仅根据缓冲区之后的空闲内存扩展数据缓冲区。

如果缓冲区后面没有空闲内存,它会为你分配一块新的内存,所以有问题的指针会改变。

UPD :作为评论中提到的 N1ghtLight ,您可以依赖指针位置,以防您在执行{reserve()方法之前分配足够的内存1}}。

答案 2 :(得分:0)

  

我一直认为append()方法不会影响内部的QByteArray内存“开头” - 它只是将一些字节附加到对象的末尾;我错了吗?

在某种程度上,你是对的。 append()不会影响数组数据开头的内容。但它可以(并且必须)有时将未更改的数据移动到更大的块。

仅仅因为data()已更改并不意味着内容已更改!