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

时间:2017-04-10 15:17:58

标签: c++ qt memory-management crash taglib

我正在尝试使用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;
  • 当我删除delete file;时,它工作正常,但打开多个文件时会出现特殊内存泄漏。

  • 如果我打开一个文件,我就无法再打开它,因为没有退出程序就无法关闭打开的文件。并且给我留下了这个错误:

  

TagLib:无法打开文件song.mp3

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

当我使用delete file;运行调试时,我看到了以下消息:

  

下级因为收到来自操作系统的信号而停止了   信号名称:SIGSEGV
  信号含义:分段故障

Program crashing message

1 个答案:

答案 0 :(得分:0)

您不需要自己删除file。而不是使用FileRef类。 它会关注删除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
        }
    }
}