【问题标题】:Constantly generating QPixmap* fails after a number of iterations多次迭代后不断生成 QPixmap* 失败
【发布时间】:2015-09-02 15:57:27
【问题描述】:

我使用以下代码来生成QPixmap* 指针,然后将它们插入QHash<QString, QPixmap*>(我将只显示指针生成代码,因为这是失败的代码)。

QPixmap* MyClass::loadImg(QString fileName)
{
    QImage qimage(fileName);
    if (qimage.isNull()) {
       qDebug() << "Cannot load image " <<  fileName;
    }

    QPixmap *image = new QPixmap(fileName);
    return image;
}

我遇到的问题如下: 对于前约 200 次调用,该方法运行良好 - 它在循环访问目录的图像文件时被调用。然后突然QPixmap* 开始返回QPixmap(null),没有明显的原因。QImage 在发生这种情况时也为空。 我已经检查并确保路径正常。此外,我尝试过使用各种图像集,但总是会发生同样的情况 - 它运行了约 200 次调用没有问题,然后开始生成空值。

任何帮助将不胜感激。

谢谢。

【问题讨论】:

    标签: qt qt4 qimage qpixmap qhash


    【解决方案1】:

    只是不要在堆上创建它。 QPixmap 是隐式共享的。

    【讨论】:

    • 这似乎已经解决了问题,所以现在我使用QHash&lt;QString, QPixmap&gt; 并更改了代码以生成非指针变量。谢谢你的帮助。只是出于兴趣,为什么它不适用于指针?
    • @Soc 由于您存储了原始指针,您可能会像筛子一样泄漏它们并且内存/资源不足,或者您进行了两次删除并破坏了程序的状态等。我我很确定如果您使用指向像素图的共享智能指针(如std::shared_ptrQSharedPointer),一切都会正常工作 - 即使考虑到相关值类型的隐式共享完全没有必要(QPixmap 等.).
    • @KubaOber 谢谢你的信息。我尝试使用QPointer,但它不适用于QPixmap,因为它不是QObject 的子类。从现在开始,我会记住QSharedPointer,但在这种情况下,我将只使用上面的解决方案,因为它工作正常。
    • @Soc 我没有告诉你使用QPointer,它不是一个拥有指针,所以它的使用毫无意义。我只是说您的问题的根源不是堆分配,而是由于双重删除导致资源泄漏或未定义行为的调用。指针是不必要的,但我可以在一百万 (10^6) 图像上运行你的代码,它工作正常。即使使用原始指针,只要我正确使用它们。问题在您没有显示的代码中的其他地方,也没有什么能让我相信您已经完全解决了这些问题。
    • @Soc 理想情况下,正确使用原始指针是不要使用它们来拥有动态存储。指针可以指向任何持续时间的存储。如果您使用new 分配,它指向动态持续时间存储。您可以通过delete-ing 来结束此类存储的存在。此时,指针悬空,您不能再使用它的当前值 - 由您决定是否使用。这就是智能指针让生活更轻松的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 2012-05-04
    • 2013-11-11
    • 2016-07-29
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    相关资源
    最近更新 更多