gpt4 book ai didi

qt - QImage 和 valgrind ;内存泄漏

转载 作者:行者123 更新时间:2023-12-01 15:33:15 27 4
gpt4 key购买 nike

我对以下代码有疑问:

#include <QtGui/QImage>

int main(int argc, char* argv[]) {
QImage qimage(100, 100, QImage::Format_ARGB32);
qimage.fill(Qt::white);
qimage.save("test.png", "PNG", 70);

return 0;
}

编译如下:

gcc -I/usr/include/qt4 test.cpp -lQtGui

代码生成正确的图像。但是,当我对其进行 valgrind 时:

valgrind --leak-check=full ./a.out

它会产生一系列丢失的 block ,如下所示:

==5974== 158 (56 direct, 102 indirect) bytes in 1 blocks are definitely lost in loss record 54 of 79
==5974== at 0x402B9B4: operator new(unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==5974== by 0x4E4E427: QLibraryPrivate::findOrCreate(QString const&, QString const&) (qlibrary.cpp:437)
==5974== by 0x4E4E721: QLibrary::setFileNameAndVersion(QString const&, QString const&) (qlibrary.cpp:1110)
==5974== by 0x56290DF: ???

或者这个:

==5974== 396 (56 direct, 340 indirect) bytes in 1 blocks are definitely lost in loss record 61 of 79
==5974== at 0x402B9B4: operator new(unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==5974== by 0x4E4E427: QLibraryPrivate::findOrCreate(QString const&, QString const&) (qlibrary.cpp:437)
==5974== by 0x4E44FB6: QFactoryLoader::updateDir(QString const&, QSettings&) (qfactoryloader.cpp:145)
==5974== by 0x56F9E67: ???

我留给你完整的日志,你可以在家里执行同样的:)

我试图理解它们似乎在我在 QImageWriter 的源代码中找到的以下行中:

QFactoryLoader *l = loader();
QStringList keys = l->keys();

在我看来,当您第一次尝试生成 PNG 图像时,它构建的内容会在您每次构建 PNG 图像时重复使用,并且该内存永远不会被释放。QFactoryLoader 的析构函数似乎知道如何清理东西,我很想亲自做一个 delete l; 但是没有办法调用它,因为 QFactoryLoader 对 Qt 的实现是私有(private)的。

有人可能会争辩说这不是真正的内存泄漏,因为每种图像格式只有一个键,但是恕我直言,做事情的干净方法是能够在退出之前清除所有内容。

所以我的问题是:有什么办法可以做到这一点吗?

最佳答案

Qt 的图像 I/O 功能基于插件。当您请求 QImage 加载 png 文件时,PNG 库作为 QObject 一次加载,直到程序退出才卸载- 这就是 Valgrind 认为的内存泄漏。

关于qt - QImage 和 valgrind ;内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11937218/

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