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;
当我删除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
}
}
}
我正在尝试使用 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: 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
}
}
}