QProcess导致内存泄漏

时间:2014-08-28 04:13:34

标签: c++ qt memory-leaks qprocess

我正在构建一个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()行,但它没有帮助。 (请注意,仅当“命令路径”程序未成功运行时才会发生内存丢失 - 例如,当我尝试运行不存在的程序时)。

有人可以解释为什么,以及如何解决这种记忆丧失的问题?

如果有帮助的话,这里有一些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&amp;, QString&amp;, unsigned int, unsigned int, unsigned long long&amp;, RunProcessWorker::EResultCodes&amp;, QProcess::ProcessError&amp;, int&amp;) 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>

1 个答案:

答案 0 :(得分:3)

并非 valgrind 的所有发现都是&#34;真实的&#34;内存泄漏,或你应该关心的泄漏。只要记忆&#34;泄漏&#34;来自图书馆,即使你多次做失败的事情也不会成长,然后不要担心。

即使在应用程序中被认为是不好的做法,库也可能从堆中分配东西,而这些东西从未被释放。库可以添加一个退出处理程序来释放它们,但是它会减慢程序的退出而无法获得实际收益,因为操作系统无论如何都会在一个大块中释放这些资源。

出于这个原因, valgrind 支持suppressing errors。使用Qt执行此操作的最简单方法是run valgrind under Qt Creator,它默认为Qt库提供正确的抑制文件。


如果您担心这实际上是一个Qt错误,那么您应该编写一个代码来循环执行漏洞操作一百万次。如果泄漏的大小增加,那么它很糟糕,你应该file a bug report使用代码来重现它。即使它是一个非常见的代码路径中的一次性泄漏,修复它可能会很好,而不是留下无用的分配来混乱堆。