我正在尝试使用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
信号含义:分段故障
答案 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
}
}
}