以下方法在运行时生成双重释放或损坏(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)。
我真的无法弄清问题是什么。调试器将第一行显示为有问题的一行。
提前感谢您的帮助。
答案 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};
}
当然,在任何一种情况下,该方法都是微不足道的,因此除了验证您是否在正确的线程中创建像素图之外,不需要使用它。