Здравствуйте
Имеется программа, написанная на Qt (С++), которая парсит входящие файлы и запихивает их в базу данных. Проблема заключается в том, что по каким-то непонятным причинам обьект, хранящий результат, не удаляется. А самое интересное заключается в том, что проблема происходит исключительно на линуксе (fedora).
Немного дополнительной информации:
1. Обработка каждого файла происходит в разных потоках. Создание нового потока реализовано в таком виде:
QThread *_t = new QThread();
QObject::connect(_t, SIGNAL(started()), task.data(), SLOT(run()), Qt::DirectConnection);
QObject::connect(task.data(), SIGNAL(finished()), this, SLOT(taskFinished()));
QObject::connect(_t, SIGNAL(finished()), _t, SLOT(quit()));
QObject::connect(_t, SIGNAL(finished()), _t, SLOT(deleteLater()));
QObject::connect(task.data(), SIGNAL(finished()), _t, SLOT(quit()));
_t->start();
2. Расширение файла - CSV. Обработка файла осуществляется
этой библиотекой
3. Обработанные данные кладутся в
struct LineParseResult { QString article, brand, price, stock, multiplicity, __article, price_id; QByteArray key; };
typedef QList<LineParseResult> PResult;
4. После того, как файл обработался и ParserTask заканчивает свою работу - эмитится сигнал finished(). Мы его ловим и получаем объект ParserTask'a:
auto _task = qobject_cast<ParserTask *>(QObject::sender());
после чего ищем его в списке тасков, которые работают на данный момент и очищаем. Список выглядит таким образом:
QList<QSharedPointer<ParserTask>> m_currentRunningTasks;
и очистка памяти осуществляется таким образом:
auto task = m_currentRunningTasks.takeAt(i);
task.clear();
4. Платформо-зависимого кода в программе не имеется, за исключением того, что присутствует в самом Qt'e
После всех проделанных операций происходят разные вещи на Windows 10 и Linux, а именно программа, которая работает на Linux (диструбтив указан в начале) потребляет гораздо больше памяти, что не так страшно, как то, что память, которая занята после обработки файла, не очищается даже принудительно. На Windows же обратное, программа ест мало памяти и очищает ее после отработки
Программа была проверена валгриндом, который говорит, что утечек не имеется
Что это может быть и как с этим бороться?