2014-08-28 2 views
1

Я создаю приложение C++/Qt5.1, которое использует QProcess для запуска другой программы, а затем ждет результата. Каждый раз, когда я запускаю этот код, valgrind говорит, что память потеряна в строке 2 (стартовая строка).QProcess вызывает утечку памяти

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(); 

Я добавил строку deleteelater(), но это не поможет. (Обратите внимание, что потеря памяти возникает только в том случае, если программа «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&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> 
+0

И память не выдается, даже когда объект QProcess выходит из области действия и разрушается? –

+0

Нет - после того, как метод (содержащий вышеприведенный код) выходит за пределы области действия, заявляет valgrind. (Это выполняется в отдельном потоке - так что я вижу ошибку, пока программа все еще работает) – TSG

+0

Обратите внимание: ваша 'command' не назначена новой, поэтому выполнение' delete' с ней будет аварийно (здесь объект выходит за рамки и уничтожает, прежде чем «deleteLater» вступает в силу, к счастью). – hyde

ответ

3

Не все данные по Valgrind «реальная» утечка памяти, или утечки, вы должны заботиться о. Пока память «утечка» поступает из библиотеки и не растет, даже если вы делаете ошибку, много раз, то не беспокойтесь об этом.

Несмотря на то, что в приложениях это считается плохой практикой, библиотеки могут выделять вещи из кучи, которые никогда не освобождаются. Библиотека может добавить обработчик выхода, чтобы освободить их, но это замедлит выход программы без реального выигрыша, поскольку ресурсы, выпущенные ОС в любом случае в одном большом фрагменте.

По этой причине valgrind поддерживает suppressing errors. Самый простой способ сделать это с помощью Qt - run valgrind under Qt Creator, который по умолчанию имеет правильный файл подавления для библиотек Qt.


Если вы обеспокоены тем, что это на самом деле Qt ошибка, то вы должны написать код, который делает вытекающей операцию в цикле в миллион раз. Если размер утечки увеличивается, тогда это плохо, и вы должны, вероятно, file a bug report с кодом для его воспроизведения. Даже если это однократная утечка в необычном пути кода, исправление, вероятно, было бы хорошим, вместо того чтобы оставлять бесполезное распределение, чтобы загромождать кучу.

+0

Я слишком новичок в Qt. Я не хочу создавать отчеты об ошибках, пока не уверен, что это не что-то глупое, что я делаю. Я действительно запускаю valgrind из Qt Creator напрямую ... так что я предполагаю, что это только показывает мне реальные утечки памяти ?! – TSG

+0

Ну, если valgrind жалуется даже на Qt Creator, то * либо * это то, что должно быть исправлено в Qt-библиотеках, * или * файлы подавления. Использование Qt Creator должно быть обновлено, чтобы игнорировать его. Поэтому, если вы можете написать короткий код, который воспроизводит это, я бы подал отчет об ошибке с кодом и инструкциями для воспроизведения (возможно, попросите [at irc] (http://qt-project.org/wiki/OnlineCommunities#fd7cfb00ff818bba4ce97ae5291ae16a) сначала о Это). – hyde

+0

Я запускал это 10 раз подряд, и утечка памяти появляется только при первом вызове start(). Означает ли это, что это «нормально»? (это небольшая утечка, или я не понимаю, что это значит) – TSG

Смежные вопросы