gpt4 book ai didi

c++ - 无法找出双重释放或损坏 (fasttop) 错误

转载 作者:行者123 更新时间:2023-11-28 05:27:31 26 4
gpt4 key购买 nike

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

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

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

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

提前感谢您的帮助。

最佳答案

鉴于像素图是隐式共享的,这种方法没有意义。按值(value)传递它们!您还应该通过 const 引用传递字符串参数,除非您打算在方法内部修改它们。

您完全可以自由地拥有 QMap<QString, QPixmap>并将一切都视为值(value)。

如果您碰巧在除主线程之外的任何线程中调用此方法,那么您将调用未定义的行为 - 您应该使用 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};
}

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

关于c++ - 无法找出双重释放或损坏 (fasttop) 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40241467/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com