Я создаю приложение 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&, 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. (Это выполняется в отдельном потоке - так что я вижу ошибку, пока программа все еще работает) – TSG
Обратите внимание: ваша 'command' не назначена новой, поэтому выполнение' delete' с ней будет аварийно (здесь объект выходит за рамки и уничтожает, прежде чем «deleteLater» вступает в силу, к счастью). – hyde