【问题标题】:How to release memory (re-)allocated by QByteArray.append()如何释放由 QByteArray.append() 分配的内存(重新)
【发布时间】:2019-01-21 09:11:32
【问题描述】:

如何释放 QByteArray 中 append() 分配的内存(重新)分配??

我在 C++ 头文件中定义了一个 QByteArray:

QByteArray buffer;

并在 cpp 文件中初始化如下:

Root:Root():
    buffer(QByteArray())
{
}

Root:Append(const QByteArray &chunk)
{
    buffer.append(chunk);
}

Root:Test()
{
    // Make the number bigger if 3000 is not big enough for 
    // append() to trigger reallocate memory
    for (int i = 0; i < 3000; i++){
        Append("xxxxxxxxxxxxxx");
    }
    // Private Bytes and Working set get increased

    buffer.clear();
    // Private Bytes and Working set DOES NOT get decreased
    // How to release the memory (re-)allocated by append() 
    // in QByteArray ??
}

【问题讨论】:

  • 也许你必须在清除后打电话给buffer.resize(0)
  • 不,resize(0) 不会释放内存,类似于 buffer.clear() 只是清除缓冲区。
  • 您能否编辑您的问题以显示您如何测量内存使用情况。

标签: qt qbytearray


【解决方案1】:

下面会将新的空 QByteArray 移动到旧的 QByteArray 中,从而有效地释放所有分配的内存:

myQByteArray = QByteArray();

感谢assignment 运营商:

QByteArray &QByteArray::operator=(QByteArray &&other)

将 other 移动分配给此 QByteArray 实例。 该功能是在 Qt 5.2 中引入的。

【讨论】:

  • 不,缓冲区 = QByteArray();不释放内存。我正在使用 Qt 5.10.1,Qt Creator 4.6.2。
  • @cnm 你怎么知道 buffer = QByteArray() 没有释放内存?
  • 通过使用“资源监视器”或“进程资源管理器”(Windows),在调用“buffer = QByteArray();”之前和之后观察私有和工作集,它们不会减少回调用 buffer.append() 之前的值;
  • @cnm 说通过观看资源监视器没有释放内存是不够的,可能是 Windows(例如垃圾收集器)尚未扫描内存以将其标记为空闲内存。这个过程有时需要时间来扫描内存
  • 当然有一个 OS 内存堆和 C-run-time 自己的堆,它们有它们的逻辑,但最终我们在上面的示例中为我们的 C++ 代码释放了可用的内存。我建议您尝试使用更大的数据。或者你需要监控 C 运行时内存堆(有特殊功能)。
猜你喜欢
  • 1970-01-01
  • 2014-04-02
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-15
  • 2020-11-09
相关资源
最近更新 更多