【发布时间】:2015-10-14 02:47:35
【问题描述】:
我正在尝试加快我的 (qt c++ opencv) 程序,该程序应该计算照片中的颜色数量以供将来过滤。 单线程方式没有泄漏,但是速度很慢。
添加 8 个线程后,我已经将此过程加速了 5 倍。
当我将程序切换到多线程时,问题就开始了。
有一个巨大的内存泄漏! http://snag.gy/cHRrS.jpg
遵循此建议 (https://stackoverflow.com/a/12859444) 我阻止了继承 QThread 并实现 run()。
这是一个 for 循环,用于计算每个移动 1 个像素的新图像中的每个像素:
ColorCounterController *cntrl[arrSize];
for (int i = 0; i < box; i++)//x
{
for (int j = 0; j < box; ++j)//y
{
cv::Mat res=process(image,i,j);
//Using 1 core
//colors=ColorDetectController::getInstance()->colorsCount(res);
//Using all 8 cores
cntrl[cnt2%arrSize]= new ColorCounterController(res,this);
++cnt2;
}
++cnt;
emit setStatusProgressSignal((int)(cnt/amnt*100));
}
delete[] *cntrl;
评论:
当使用 1 个核心(以上代码)时,我有单例来运行 colorsCount(res) 函数。 在 8 个内核的情况下,我使用几乎相同的函数,但从 ColorCounterController 调用。
class ColorCounterController : public QObject{
Q_OBJECT
private:
QThread thread;
ColorCounter *colorCntr;
Pixalate *pixelate;
private slots:
void freecolorCntr(){
delete colorCntr;
}
public:
ColorCounterController(const cv::Mat &image,Pixalate *pxobj) {
colorCntr= new ColorCounter();
colorCntr->setimageThread(image);
colorCntr->moveToThread(&thread);
connect(&thread, SIGNAL(started()), colorCntr, SLOT(colorsCountThread()));
connect(colorCntr, SIGNAL(finished()), &thread, SLOT(quit()));
connect(colorCntr, SIGNAL(finished()), colorCntr, SLOT(deleteLater()));
connect(colorCntr, SIGNAL(results(int)), pxobj, SLOT(results(int)));
thread.start();
}
~ColorCounterController() {
thread.quit();
thread.wait();
qDebug() << QString("Controller quit wait");
//delete colorCntr; //err
}
我想泄漏是在 ColorCounterController 构造函数中:
colorCntr= new ColorCounter();
但是如何避免呢?此代码导致错误。 在析构函数中:
//delete colorCntr; //err
在构造函数中:
//connect(&thread, SIGNAL(finished()), &thread, SLOT(deleteLater()));
请帮忙!
附言
我改变了这个
delete[] *cntrl;
到这里
for (int i = 0; i < arrSize; i++){
if (cntrl[i])
delete cntrl[i];
}
cntrl[cnt2%arrSize]之前的所有指针都为NULL
没有改变
附言 如果您想为这个问题做出贡献: https://github.com/ivanesses/curiosity
【问题讨论】:
-
删除colorCntr有什么错误;造成?它是编译器还是运行时?你使用什么编译标志?另外...您能否提供更多的未标记、无标题图表来表示内存泄漏? faculty.spokanefalls.edu/InetShare/AutoWebs/AsaB/GoodGraphs.pdf
-
运行时错误读取访问冲突snag.gy/iyNku.jpg
-
关于图表。对不起那一团糟。它只是表明我在 1 分钟内失去了近一半的内存 (8/16Gb)。
-
"你使用什么编译标志?" - 我使用来自 VS2013 的编译器 x64/vc12 和 Qt 默认设置 这是 Qt QT += core gui greaterThan(QT_MAJOR_VERSION, 4) 中的一些 .pro 设置:QT += widgets TARGET = Curiosity TEMPLATE = app
-
为什么不使用内存分析器?从代码中很难理解可能是什么问题:原始指针等。我知道这是 Qt 风格,但无论如何......试试探查器!
标签: c++ multithreading performance qt memory-leaks