【问题标题】:TagLib crashes when destructing TagLib::File and couldn't close opened TagLib::FileTagLib 在破坏 TagLib::File 时崩溃并且无法关闭打开的 TagLib::File
【发布时间】:2017-04-10 15:17:58
【问题描述】:

我正在尝试使用 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

【问题讨论】:

  • 你能在崩溃后给我们调试器输出吗? (堆栈溢出?访问错误,堆损坏崩溃?)
  • 对不起@Raxvan ...这是我第一次发布问题。我已经添加了调试结果。

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


【解决方案1】:

您不需要自己删除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
        }
    }
}

【讨论】:

  • 感谢@Evgeny,它解决了我所有的问题。我发现在我的代码中我手动删除了一些标签,导致程序崩溃。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多