我正在使用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;
}
但是当我离开这个功能时也会发生同样的事情。我有点难过,因为如果我不介意删除框架,那么我将为自己创造一个大问题。如果有人能给我一些见解。
答案 0 :(得分:3)
从TagLib API文档:
void TagLib :: ID3v2 :: Tag :: addFrame(Frame * frame)
向标记添加框架。此时标签取得框架的所有权 并将处理释放它的记忆。
标签负责删除框架。如果您自己也删除了框架,最终会进行双重删除,如果标签在其析构函数中删除之前访问该框架,那么也会导致访问冲突。