TagLib 在破坏时崩溃 TagLib::File 并且无法关闭打开 TagLib::File

TagLib crashes when destructing TagLib::File and couldn't close opened TagLib::File

我正在尝试使用 Qt5 C++ 中的 TagLib 库 (1.11.1) 制作音乐播放器。我打开了多个文件并读取了标签。我遇到了两个困难。打开文件并读取标签后,我无法关闭文件并释放文件占用的内存。我使用 delete 释放内存并关闭文件。但是当我尝试这个时程序崩溃了。这是我的程序的代码片段:

QString audioPath("song.mp3")
auto file = new MPEG::File(audioPath.toStdWString().c_str());

if (file->isOpen()) {
    auto tag = file->ID3v2Tag();
    if (tag) {
        //read audio tags
    }
}

delete file;

TagLib: Could not open file song.mp3

有没有办法解决内存泄漏并关闭打开的文件?

当我 运行 使用 delete file; 调试时,我看到这条消息:

The inferior stopped because it received a signal from the operating system.
Signal name: SIGSEGV
Signal meaning: Segmentation fault

Program crashing message

您不需要自己删除 file。而不是使用 FileRef class。 它将注意删除 file 对象。 示例:

TagLib::String str(audioPath.toUtf8().constData(), TagLib::String::UTF8 );
#ifdef Q_OS_WIN
TagLib::FileName fname(str.toCWString());
#else
TagLib::FileName fname(str.toCString(true));
#endif
TagLib::FileRef ref(fname, true, TagLib::AudioProperties::Accurate);
if(!ref.isNull()) {
    auto mpeg = dynamic_cast<TagLib::MPEG::File*>(ref.file());

    if(mpeg) {
        TagLib::ID3v2::Tag* tag = mpeg->ID3v2Tag();
        if(tag) {
            //your code here
        }
    }
}