删除或智能指针失败

时间:2017-01-02 09:33:50

标签: qt taglib

我正在使用Taglib并将封面艺术写入mp3。以下代码适用:

 bool MediaHelper::AddCoverArt(const QString &media, const QString &image_file)
 {
    TagLib::MPEG::File mpeg(media.toStdString().c_str());
    TagLib::ID3v2::Tag *id3v2Tag = mpeg.ID3v2Tag(true);
    TagLib::ID3v2::AttachedPictureFrame *frame = new TagLib::ID3v2::AttachedPictureFrame;
    frame->setMimeType("image/jpeg");
    frame->setPicture(image.data());
    id3v2Tag->addFrame(frame);
    mpeg.save();
    delete frame;
    return true;
}

但是一旦我离开该功能,应用程序就会因读取访问冲突而崩溃

然后我用QScopedPointer尝试了它:

 bool MediaHelper::AddCoverArt(const QString &media, const QString &image_file)
 {  
    TagLib::ID3v2::Tag *id3v2Tag = mpeg.ID3v2Tag(true);
    QScopedPointer<TagLib::ID3v2::AttachedPictureFrame> frame(new TagLib::ID3v2::AttachedPictureFrame);
    frame->setMimeType("image/jpeg");
    frame->setPicture(image.data());
    id3v2Tag->addFrame(frame.data());
    mpeg.save();    
    return true;
}

但是当我离开这个功能时也会发生同样的事情。我有点难过,因为如果我不介意删除框架,那么我将为自己创造一个大问题。如果有人能给我一些见解。

1 个答案:

答案 0 :(得分:3)

从TagLib API文档:

  

void TagLib :: ID3v2 :: Tag :: addFrame(Frame * frame)

     

向标记添加框架。此时标签取得框架的所有权   并将处理释放它的记忆。

标签负责删除框架。如果您自己也删除了框架,最终会进行双重删除,如果标签在其析构函数中删除之前访问该框架,那么也会导致访问冲突。