我注意到在某些情况下执行以下代码后
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; - 它只是将一些字节附加到对象的末尾;我错了吗?
答案 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()
已更改并不意味着内容已更改!