删除或智能指针故障

Delete or smart pointer failure

我正在使用 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;
}

但是当我离开函数时,同样的事情发生了。我有点难过,因为如果我不注意删除框架,那么我就会给自己制造一个大问题。如果有人能给我一些见解。

来自 TagLib API 文档:

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

Add a frame to the tag. At this point the tag takes ownership of the frame and will handle freeing its memory.

标签负责删除框架。如果您自己也删除框架,则最终会出现两次删除,并且如果标记在其析构函数中删除框架之前访问框架,也会导致访问冲突。