Taglib Qt读取访问冲突

时间:2017-01-02 06:48:17

标签: qt taglib

似乎当你试图从taglib中的mp3获得评级并且它已被打开时,它将导致读取访问冲突:

enter image description here

这是我的代码:

QFile fileInfo(file);
fileInfo.open(QIODevice::ReadOnly);
if(fileInfo.isReadable())
{
    TagLib::MPEG::File mpeg(file.toStdString().c_str());
    bool isRead = mpeg.isReadable(file.toStdString().c_str());
    if(isRead)
        rating = dynamic_cast<TagLib::ID3v2::PopularimeterFrame *>(mpeg.ID3v2Tag()->frameList("POPM").front())->rating();
}

我尝试过添加try / catch但它仍然失败。我尝试过QLockFile但没有成功。有没有办法测试文件是否具有文件的专有权或捕获读访问冲突?

更新 感谢我的提示,我修改了我的代码,首先检查无效值:

if(mpeg.ID3v2Tag() != 0)
{
    if(dynamic_cast<TagLib::ID3v2::PopularimeterFrame *>(mpeg.ID3v2Tag()->frameList("POPM").front()) != 0)
    {
        rating = dynamic_cast<TagLib::ID3v2::PopularimeterFrame *>(mpeg.ID3v2Tag()->frameList("POPM").front())->rating();
    }
}

2 个答案:

答案 0 :(得分:1)

读取访问冲突与文件读取无关,程序尝试对其无法访问的内存进行读取访问。

在您的情况下,您尝试访问空指针(0x0)。

在最后一行代码中有两个指针访问操作,在尝试调用方法之前,它们都不是空指针

答案 1 :(得分:0)

由于this question中的代码,您已经遇到了这个问题。您以错误的方式创建POPM框架,然后投射失败。

注意dynamic_cast是经过检查的演员类型。它失败时返回零,就像它在这里一样。您需要在假设它起作用之前检查返回值(否则您通常会使用static_cast)。