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()
已经改变并不意味着 内容 已经改变!
我注意到在某些情况下执行以下代码后
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()
已经改变并不意味着 内容 已经改变!