【发布时间】:2017-03-07 14:11:30
【问题描述】:
以下方法在运行时生成双重释放或损坏 (fasttop) 错误(在第一行)。它是随机发生的,即它可能发生在程序运行的第一秒或 35 秒。
QSharedPointer<QPixmap> Utils::loadImg(QString fileName)
{
QPixmap *pixmap = new QPixmap(fileName);
QSharedPointer<QPixmap> qspPixmap(pixmap);
return qspPixmap;
}
这是一个静态方法,我调用它来获取像素图的指针(实际上是使用 Qt 提供的智能指针)。获得智能指针后,我将其存储到地图结构中以备后用。当我从地图结构中删除条目时,它应该释放内存,并且看起来确实如此。 请注意,loadImg(QString) 方法是由另一个在其自己的线程上运行的方法调用的(使用 Qt 提供的 QtConcurrent 和 QFuture)。
我真的无法弄清楚问题是什么。调试器将第一行显示为有问题的行。
提前感谢您的帮助。
【问题讨论】:
-
哪一行是“第一”行?如果您使用的是 Linux,请尝试使用 valgrind。
-
在你到达那条线之前很可能发生了一些不好的事情,但那是内存管理器发现损坏的时候。您需要向后工作并检查到目前为止的所有内存管理。
-
在 valgrind 下运行您的应用程序可能会帮助您找到堆最初损坏的位置。
-
大家好,第一行是指创建原始指针(不是智能指针)的行。我在 Linux 上,所以我会按照你的建议尝试 valgrind,我根本没有使用它的经验。