无法弄清楚双重免费或腐败(fasttop)错误

时间:2016-10-25 13:35:03

标签: c++ qt

以下方法在运行时生成双重释放或损坏(fasttop)错误(在第一行)。它是随机发生的,即它可能在程序运行时的第一秒或35秒发生。

QSharedPointer<QPixmap> Utils::loadImg(QString fileName)
{
    QPixmap *pixmap = new QPixmap(fileName);
    QSharedPointer<QPixmap> qspPixmap(pixmap);
    return qspPixmap;
}

这是一个静态方法,我正在调用以获取pixmap的指针(实际上使用Qt提供的智能指针)。一旦我得到智能指针,我将它存储到地图结构中供以后使用。当我从地图结构中删除条目时,它应该释放内存,它似乎就是这样做的。 请注意,loadImg(QString)方法由另一个在其自己的线程上运行的方法调用(使用Qt提供的QtConcurrent和QFuture)。

我真的无法弄清问题是什么。调试器将第一行显示为有问题的一行。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

鉴于pixmaps是隐式共享的,这种方法毫无意义。按价值传递它们!您还应该通过const引用传递字符串参数,除非您打算在方法内修改它们。

您可以完全自由地拥有QMap<QString, QPixmap>并将所有内容视为价值观。

如果您在任何线程中调用此方法,而不是主线程,那么您将调用未定义的行为 - 您应该使用QImage代替。

您的方法应如下所示:

QPixmap Utils::loadImg(const QString & fileName)
{
   Q_ASSERT(QThread::currentThread() == qApp->thread());
   return QPixmap{fileName};
}

如果您打算在任意线程中调用它,您应该:

QImage Utils::loadImg(const QString & fileName)
{
   return QImage{fileName};
}

当然,在任何一种情况下,该方法都是微不足道的,因此除了验证您是否在正确的线程中创建像素图之外,不需要使用它。