Taglib 设置相册图片但给出 seg 错误

Taglib sets album picture but gives seg fault

我正在尝试使用 TagLib 在 .mp3 中设置专辑封面,但出现错误 11(段错误),我似乎找不到解决方案。
到目前为止,这是我的代码:

TagLib::MPEG::File mp3_file(filename.c_str());
TagLib::ID3v2::Tag *mp3_tag;

mp3_tag = mp3_file.ID3v2Tag(true);
TagLib::ID3v2::AttachedPictureFrame picture;
picture.setMimeType("image/jpeg");
picture.setDescription("Cover");
picture.setType(TagLib::ID3v2::AttachedPictureFrame::FrontCover);

std::ifstream image(image_path, std::ios::binary | std::ios::ate);
const auto fileSize = image.tellg();
image.seekg(0);
TagLib::ByteVector image_data((unsigned int) fileSize, 0);
image.read(image_data.data(), fileSize);
image.close();
picture.setPicture(image_data);
mp3_tag->addFrame(&picture);
mp3_file.save();

图像是 .jpg,因此 MIME 类型是正确的。 当代码到达 mp3_tag->addFrame(&picture); 行时,它存在段错误,奇怪的是图像被设置为 .mp3 文件,所以我不明白是什么导致了这个错误。
我也尝试通过使用此库查看一些 C# 和 Ruby 代码来寻找可能的原因,但我找不到不会导致分段错误的解决方案。

我从未接触过 TagLib,但是,阅读 the documentation,需要在堆上分配 TagLib::ID3v2::AttachedPictureFrame picture; 变量,因为 TagLib::ID3v2::Tag::addFrame(Frame* frame) 函数将取得框架的所有权, 因此负责释放内存。
发生段错误是因为它试图释放分配在堆栈上的内存(picture 变量)。

您可能想要的是:

[...]
std::ifstream image(image_path, std::ios::binary | std::ios::ate);
const auto fileSize = image.tellg();
image.seekg(0);
TagLib::ByteVector image_data((unsigned int) fileSize, 0);
image.read(image_data.data(), fileSize);
image.close();

TagLib::ID3v2::AttachedPictureFrame* picture = new TagLib::ID3v2::AttachedPictureFrame(image_data);
mp3_tag->addFrame(&picture);
mp3_file.save();
[...]