c++ - 如何通过Valgrind查找QThreads程序中的内存泄漏位置?

标签 c++ qt memory-leaks valgrind qthread

标题:

#ifndef CONTROLLER_THREAD
#define CONTROLLER_THREAD

#include <QThread>
#include <QTimer>

class Worker : public QObject
{
    Q_OBJECT
public:
    QTimer timer;

    Worker();
    ~Worker();

private slots:
    void calculateImage();

signals:
    void imageReady();
};

class Controller: public QObject
{
    Q_OBJECT
public:
    QThread objQThread;

    Controller();
    ~Controller();

public slots:
    void receiveImage();
};

#endif // CONTROLLER_THREAD

来源:

#include <controller_thread.h>
#include <iostream>
using namespace std;

Worker::Worker()
{
    connect( &timer, SIGNAL(timeout()), this, SLOT(calculateImage()) );
    timer.start(1000);
}

Worker::~Worker() {}

void Worker::calculateImage()
{
}

Controller::Controller()
{
    Worker *objWorker = new Worker();
    objWorker->moveToThread( &objQThread );

    connect( &objQThread, &QThread::finished, objWorker, &QObject::deleteLater );
    connect( objWorker, &Worker::imageReady, this, &Controller::receiveImage );

    objQThread.start();
}

Controller::~Controller()
{
    objQThread.quit();
    objQThread.wait();
}

void Controller::receiveImage()
{

}

主要.cpp

#include "mainwindow.h"
#include <QApplication>
#include "controller_thread.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    Controller f;

    MainWindow w;
    w.show();


    return a.exec();
}

MainWindow 类当前为空:

标题:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
};

#endif // MAINWINDOW_H

来源:

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
}

MainWindow::~MainWindow()
{    
}

Valgrind 说:

$ valgrind ./qmultithreading_paint 
==17570== Memcheck, a memory error detector
==17570== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==17570== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==17570== Command: ./qmultithreading_paint
==17570== 
QObject::killTimer: Timers cannot be stopped from another thread
QObject::~QObject: Timers cannot be stopped from another thread
==17570== 
==17570== HEAP SUMMARY:
==17570==     in use at exit: 1,333,179 bytes in 14,454 blocks
==17570==   total heap usage: 106,397 allocs, 91,943 frees, 8,932,264 bytes allocated
==17570== 
==17570== LEAK SUMMARY:
==17570==    definitely lost: 156 bytes in 2 blocks
==17570==    indirectly lost: 58 bytes in 1 blocks
==17570==      possibly lost: 16,177 bytes in 217 blocks
==17570==    still reachable: 1,234,172 bytes in 13,558 blocks
==17570==                       of which reachable via heuristic:
==17570==                         length64           : 5,336 bytes in 89 blocks
==17570==                         newarray           : 2,160 bytes in 55 blocks
==17570==         suppressed: 0 bytes in 0 blocks
==17570== Rerun with --leak-check=full to see details of leaked memory
==17570== 
==17570== For counts of detected and suppressed errors, rerun with: -v
==17570== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
$

标题

valgrind 在这里说的是什么?我该如何解决?

definitely lost: 156 bytes in 2 blocks ==17570== indirectly lost: 58 bytes in 1 blocks

最佳答案

泄漏似乎是在库 (Qt) 代码中,并且在很大程度上是无关紧要的。如果您真的想尝试修复它,您必须首先摆脱 Timers cannot be stopp from another thread 错误。参见例如this answer .

我几乎可以肯定计时器列表泄漏:请参阅 _q_reregisterTimers handler - 如果对象在错误的线程中,则不会调用它,因此不会删除列表。

关于c++ - 如何通过Valgrind查找QThreads程序中的内存泄漏位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50791679/

相关文章:

c++ - 如何在不构造 key_type 对象的情况下在 std::multiset 中进行二进制搜索?

c++ - const 到非 const 迭代器比较,它们是否有效

c++ - Qt C++ 与 'operator<<' 流不匹配

c# - 防止 WPF 中的内存泄漏

c++ - Int 到 LPWSTR 函数的问题

c++ - 如何像Java一样使用C++实现printstacktrace

c++ - 如何将枚举类传递给 QML?

c++ - 在构建基于 C++ 的软件中包含 QtGui 文件的问题

c++ - 在 Mac 上使用 Instruments 检查内存泄漏

oracle - 热重新部署和 Oracle 数据库的 Permgen 内存泄漏