【问题标题】:QPixmap loadFromData() segmentation faultQPixmap loadFromData() 分段错误
【发布时间】:2014-02-05 21:09:17
【问题描述】:
 QZipReader reader(filename);

 QPixmap thumbnail;
 auto thumbnail_bytearr = reader.fileData("thumbnail.png");

 thumbnail.loadFromData(thumbnail_bytearr, "PNG");

调用 loadFromData 时发生分段错误,我不明白为什么。存档没问题。

【问题讨论】:

    标签: c++ qt segmentation-fault qpixmap


    【解决方案1】:

    loadFromData 替换为:

    QFile out("thumbnail-out.png");
    out.open(QIODevice::WriteOnly);
    out.write(thumbnail_bytearr);
    out.close();
    

    然后确保写入thumbnail-out.png 的内容是有效的PNG 文件。只要 libpng 可以读取它,Qt 也应该读取它。我的预感是您的 reader 返回损坏的、空的或无效的字节数组。

    【讨论】:

    • 虽然崩溃仍然是一个错误和潜在的安全问题 - 因此将导致崩溃的数据作为测试用例会很有趣。
    【解决方案2】:

    我不确定您的问题出在从存档中提取,但您最好通过将获得的字节数组写入 .png 文件并检查它是否正常来检查它。

    无论如何QZipReader 是未记录的 Qt 类我不确定是否适合使用它,因为没有任何保证或任何保证。如果你不介意使用 Qt 之外的东西,我推荐Minizip,它易于使用,也是zlib 的一部分。

    【讨论】:

    • 我可能同意您关于不使用 Qt 内部的建议,但 Qt 的最大好处是应用程序开发人员可以完全控制正在发生的事情。毕竟,他们选择了特定的版本,可以区分来源,并运行升级周期。如果它是一个使用系统 Qt 的 Unix 打包的 OSS 项目,那就有点不同了,但即使这样,捆绑自己的 Qt 也并非闻所未闻。
    • @KubaOber 是的,这是真的,但另一方面,如果类没有记录,则几乎不可能报告一些关于它的错误或它已经过彻底测试。例如,在这种情况下,决定使用它的开发人员很难测试它是否适用于各种 .zip 文件,并且几乎无法保证库开发人员正确维护这些类。
    • 同意。这是一个警告购买者的情况:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多