删除或智能指针故障
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.
标签负责删除框架。如果您自己也删除框架,则最终会出现两次删除,并且如果标记在其析构函数中删除框架之前访问框架,也会导致访问冲突。
我正在使用 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.
标签负责删除框架。如果您自己也删除框架,则最终会出现两次删除,并且如果标记在其析构函数中删除框架之前访问框架,也会导致访问冲突。