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

QByteArray:: append() leads to memory reallocation

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

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 内存 "at the beginning" - 它只是将一些字节附加到对象的末尾;我错了吗?

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

When you append() data to a non-empty array, the array will be reallocated and the new data copied to it.

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

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

QByteArray在数据后预分配了一定数量的space,超出之后使用realloc,可以不可以只扩展数据缓冲区,具体取决于free缓冲区后的内存存在。

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

UPD:正如评论中提到的N1ghtLight,如果你使用reserve()方法,你可以依靠指针位置在执行 append().

之前分配足够的内存

I always thought that append() method doesn't affect inner QByteArray memory "at the beginning" - it just appends some bytes to the end of object; Am I wrong?

从某种意义上说,你是对的。 append() 不影响数组数据开头的 contents。但有时它可以(而且必须)将未更改的数据移动到更大的块。

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