无法找出双重自由或腐败(fasttop)错误

Cannot figure out double free or corruption (fasttop) error

本文关键字:fasttop 错误 自由      更新时间:2023-10-16

下面的方法在运行时生成一个双自由或损坏(fasttop)错误(在第一行)。它是随机发生的,也就是说,它可能发生在程序运行的第1秒或第35秒。

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

这是一个静态方法,我调用来获得一个像素图的指针(实际上使用Qt提供的智能指针)。获得智能指针后,我将其存储到一个映射结构中以供以后使用。当我从map结构中删除条目时,它应该释放内存,看起来确实如此。注意,loadmg (QString)方法是由另一个在自己的线程上运行的方法调用的(使用Qt提供的QtConcurrent和QFuture)。

我实在想不出问题是什么。调试器将第一行显示为有问题的行。

提前感谢您的帮助

考虑到像素图是隐式共享的,这个方法没有意义。按值传递它们!你还应该通过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};
}

当然,在这两种情况下,该方法都是微不足道的,所以没有必要使用它,除了验证您正在正确的线程中创建像素图。