繁体   English   中英

QT:如何正确清理 QSettings 以防止内存泄漏?

[英]QT: how to properly clean up QSettings to prevent memory leak?

我编写了以下小示例测试用例,它只是将单个键/值写入QSettings对象(使用Qt 5.5 ):

#include <QSettings>

int main()
{
    QSettings settings("/tmp/settings.ini", QSettings::IniFormat);

    std::string data = "world";
    QByteArray arr(data.c_str(), data.size());

    settings.setValue("hello", arr);
    return 0;
}

我编译如下:

$ g++ main.cpp -I${QTDIR}/include -I${QTDIR}/include/QtCore -fpic \
        -L${QTDIR}/lib -Wl,-R -Wl,"$QTDIR/lib" -lQt5Core -o test

正如预期的那样,运行它不会产生stdout / stderr输出

$ ./test

但是,通过查看它创建的"settings.ini"文件,我们可以看到它按预期工作:

$ cat /tmp/settings.ini 
[General]
hello=@ByteArray(world)

但是,虽然valgrind运行它会报告内存泄漏

$ valgrind --quiet --leak-check=full ./test

==2148== 4 bytes in 1 blocks are definitely lost in loss record 1 of 4
==2148==    at 0x4C2B0E0: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2148==    by 0x4EC4CA1: qrand() (in ${QTDIR}/lib/libQt5Core.so.5.5.0)
==2148==    by 0x5012CC3: ??? (in ${QTDIR}/lib/libQt5Core.so.5.5.0)
==2148==    by 0x4FE6291: QFile::open(QFlags<QIODevice::OpenModeFlag>) (in ${QTDIR}/lib/libQt5Core.so.5.5.0)
==2148==    by 0x5013350: QTemporaryFile::open(QFlags<QIODevice::OpenModeFlag>) (in ${QTDIR}/lib/libQt5Core.so.5.5.0)
==2148==    by 0x505CA7D: ??? (in ${QTDIR}/lib/libQt5Core.so.5.5.0)
==2148==    by 0x505DE8C: ??? (in ${QTDIR}/lib/libQt5Core.so.5.5.0)
==2148==    by 0x4FF5A3B: QLockFile::tryLock(int) (in ${QTDIR}/lib/libQt5Core.so.5.5.0)
==2148==    by 0x503DE80: ??? (in ${QTDIR}/lib/libQt5Core.so.5.5.0)
==2148==    by 0x503F0C8: QSettings::~QSettings() (in ${QTDIR}/lib/libQt5Core.so.5.5.0)
==2148==    by 0x400E72: main (in /home/steve/test)
==2148== 

可以看出,这是源自QSettings析构函数。

QSettings::sync()

请注意,调用settings.sync()对内存泄漏没有影响,它所做的只是将泄漏移到sync() ,而不是析构函数。

这是意料之中的,因为文档指出sync()是从析构函数调用的。

题:

如何正确清理以防止这种内存泄漏?

这是一个 Qt 错误,但您还不知道它是否重要。 检查您是否可以制造更多内存泄漏。 在一个循环中做这整个事情 1000 次,如果它泄漏了 1000 个int ,你绝对应该提交一个错误报告。 否则它的优先级会很低。

如何正确清理以防止这种内存泄漏?

你已经在正确清理了。 它是 C++ 和 RAII 类,您不必做任何事情。 这不是 C。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM