gpt4 book ai didi

c++ - 破坏 TagLib::File 时 TagLib 崩溃并且无法关闭打开的 TagLib::File

转载 作者:行者123 更新时间:2023-12-02 08:45:48 25 4
gpt4 key购买 nike

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

最佳答案

您不需要自己删除文件。而不是使用 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
}
}
}

关于c++ - 破坏 TagLib::File 时 TagLib 崩溃并且无法关闭打开的 TagLib::File,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43327013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com