【发布时间】:2014-08-28 04:13:34
【问题描述】:
我正在构建一个 C++/Qt5.1 应用程序,它使用 QProcess 启动另一个程序,然后等待结果。每次我运行这段代码时,valgrind 都会在第 2 行(起始行)说内存丢失。
QProcess command(this);
command.start(commandpath, myParameters);
if (command.waitForStarted(waitToStart)) {
command.write(myStdIn.toLatin1());
command.closeWriteChannel();
if (command.waitForFinished(waitToFinish)) {
myStdOut = command.readAllStandardOutput();
myStdErr = command.readAllStandardError();
}
}
command.deleteLater();
我添加了 deletelater() 行,但没有帮助。 (请注意,仅当“commandpath”程序未成功运行时才会发生内存丢失 - 例如,当我尝试运行不存在的程序时)。
谁能解释一下为什么,以及如何解决这种记忆丧失?
如果有帮助,这里有一些 valgrind 输出:
16 bytes in 1 blocks are definitely lost in loss record 57 of 678
in RunProcessWorker::run(RunProcessWorker::EMutex, QString, QString, QString, bool, QString, QStringList, QStringList, QString, QString&, QString&, unsigned int, unsigned int, unsigned long long&, RunProcessWorker::EResultCodes&, QProcess::ProcessError&, int&) in /mnt/lserver2/data/development/haast/src/systemcommands/runprocessworker.cpp:249
1: operator new[](unsigned long) in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so
2: /opt/Qt5.1.0/5.1.0/gcc_64/lib/libQt5Core.so.5.1.0
3: QProcess::open(QFlags<QIODevice::OpenModeFlag>) in /opt/Qt5.1.0/5.1.0/gcc_64/lib/libQt5Core.so.5.1.0
4: QProcess::start(QString const&, QStringList const&, QFlags<QIODevice::OpenModeFlag>) in /opt/Qt5.1.0/5.1.0/gcc_64/lib/libQt5Core.so.5.1.0
5: RunProcessWorker::run(RunProcessWorker::EMutex, QString, QString, QString, bool, QString, QStringList, QStringList, QString, QString&, QString&, unsigned int, unsigned int, unsigned long long&, RunProcessWorker::EResultCodes&, QProcess::ProcessError&, int&) in <a href="file:///mnt/lserver2/data/development/haast/bin/debug/../../src/systemcommands/runprocessworker.cpp:249" >/mnt/lserver2/data/development/haast/src/systemcommands/runprocessworker.cpp:249</a>
【问题讨论】:
-
而且即使
QProcess对象超出范围并被破坏内存也没有释放? -
否 - 在方法(包含上述代码)超出范围后,valgrind 抱怨。 (这是在一个单独的线程中运行 - 所以我在程序仍在运行时看到了错误)
-
请注意,您的
command没有分配新的,因此使用它执行delete会崩溃(幸运的是,这里的对象超出范围并在deleteLater生效之前销毁)。跨度> -
我缺乏 Qt 专业知识,无法确定,这个错误可能与此有关吗? (bugreports.qt-project.org/browse/QTBUG-33021) 注意程序不执行时内存丢失的情况!
-
我升级到 Qt Creator 5.3.1(其中应该包含对这个错误的修复),但错误仍然存在。 (我假设 qt-creator 捆绑了最新的 Qt 库)
标签: c++ qt memory-leaks qprocess