![](/img/trans.png)
[英]Best way to clean up `QSettings` registry entries (Qt 5 on Windows)
[英]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.