gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 02:20:31 25 4
gpt4 key购买 nike

我编写了以下小型示例测试用例,它只是将单个键/值写入 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() 内部转移,而不是析构函数。

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

问题:

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

最佳答案

这是一个 Qt 错误,但您还不知道它是否重要。检查是否可以制造更多 内存泄漏。在一个循环中执行整个操作 1000 次,如果它泄漏 1000 个 int,您绝对应该提交错误报告。否则它将具有低优先级。

How can I properly clean up to prevent this memory leak?

您已经正确清理了。它是 C++ 和 RAII 类,您无需执行任何操作。这不是 C。

关于c++ - QT:如何正确清理QSettings以防止内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32617659/

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