gpt4 book ai didi

qt - 最小的Qt程序导致内存泄漏

转载 作者:行者123 更新时间:2023-12-02 01:23:01 24 4
gpt4 key购买 nike

这是一个几乎最小的 Qt 程序,它应该释放所有资源,包括内存:

#include <QApplication>
#include <QMainWindow>
#include <memory>

int main(int argc, char** argv) {
QApplication app(argc, argv);
std::unique_ptr<QWidget> wnd{new QWidget()};
wnd->show();
return app.exec();
}

但是,valgrind 说:

LEAK SUMMARY:
definitely lost: 979 bytes in 24 blocks
indirectly lost: 7,858 bytes in 56 blocks
possibly lost: 912 bytes in 19 blocks
still reachable: 75,719 bytes in 1,080 blocks
of which reachable via heuristic:
newarray : 832 bytes in 16 blocks
suppressed: 0 bytes in 0 blocks
Rerun with --leak-check=full to see details of leaked memory

我希望“绝对丢失”和“间接丢失”得到零,但丢失了字节。为什么?我是否错误地解释了 valgrind 输出,或者我应该调用 Qt 的一些额外的退出函数?

最佳答案

“正确/适当/无论你的优良指标是什么”代码都不会泄漏内存是一个错误的假设。

内存泄漏有两种类型:启动或永远不会重复的一次性分配,以及可以重复任意且不断增加的次数的分配的持续泄漏。后者的问题是可以理解的,应该与他们进行恶毒的斗争,直到他们灭亡。

相反,释放启动内存绝对是一种浪费,毫无顾虑。当接下来发生的事情是进程终止时,每个专门用于它的 CPU 周期都被浪费了,所有内存都以尽可能循环和节能的方式释放。这些分配不是泄漏。它们在上添加到您的内存调试工具的异常列表中。

在进程终止之前对每个内存块的狂热释放对快速连续执行多次的应用程序的能源效率具有可衡量的影响。对于常见的短期进程,例如许多 Unix 核心实用程序和构建工具,包括编译器,退出之前的 free 已经在世界各地的发电厂浪费了许多铁路车的煤炭,而这趋势没有放缓的迹象。

Valgrind 是天赐之物。但你不能以崇敬的态度来对待它的输出,最好是给一个更好的神灵。不要开发基于 Valgrind 输出的软件,就好像它是 cargo 崇拜一样。理解输出的含义,并采取相应的行动。

关于qt - 最小的Qt程序导致内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38808886/

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