gpt4 book ai didi

c++ - 确保 QByteArray 拥有它的内存 (QByteArray::fromRawData)

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:08:29 25 4
gpt4 key购买 nike

假设我们有一个功能商店

void store(const QByteArray& data);

此函数的工作是获取数据 并将其存储起来。不幸的是,如果参数是用 QByteArray::fromRawData(ptr, size) 创建的,那么这样做是不安全的,因为它及其所有拷贝都要求 ptr 保持有效.

因此 store 无法禁止其调用者传入这样的数组,将 data 视为 const char* 在类固醇上或使用 detach 强制深度复制。所有这些都不令人满意,尤其是后者会损害性能,因为如果 data 在传递到 store 之前被 COW 复制,我们将进行不必要的深度复制。

QByteArray 有一个 private 函数 nulTerminated 其实现似乎正是我想要的:如果它不拥有内存,它深拷贝。如果它拥有内存,它只会返回 *this

真的有两个问题

  • 是否有使用public 设施的解决方法?

  • Qt 文档提到 ptr 必须仅在返回值及其任何拷贝的生命周期内有效。如果你说 .right(.size()),这似乎不是一个拷贝,所以 Qt 需要根据文档进行深度复制。但它真的这样做了吗?

最佳答案

查看源代码(例如 here ),ba.right(ba.size()); 实际上是简单的浅拷贝,几乎是空操作,所以这不是解决方案为你。在任何情况下,依赖任何没有文档支持的行为都有点不安全,它可能会在未来的 Qt 版本中更改而不通知。

也就是说,QByteArray::detach()没有记录但公开。它将对使用 fromRawData() 创建的数组执行深度复制,但不会对已经取消共享的数据执行深度复制,我认为这不太可能改变。示范:

QByteArray ba1 = QByteArray::fromRawData("foo", 4);
QByteArray ba2("foo");
qDebug() << (void*)ba1.constData() << (void*)ba2.constData();
ba1.detach(); ba2.detach();
qDebug() << (void*)ba1.constData() << (void*)ba2.constData();

例如上面的输出:

0x804b960 0x93ebfd8
0x93d2170 0x93ebfd8

查看源代码,IS_RAW_DATA macroqbytearray.cpp 文件中,我没有发现您可以通过公共(public)接口(interface)利用它的任何方式。所以,做你想做的事似乎是不可能的,而 detach() 是你能得到的最接近的,即使 QByteArray::squeeze() 也不会分离原始数据。

关于c++ - 确保 QByteArray 拥有它的内存 (QByteArray::fromRawData),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36116013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com