2017-04-10 52 views
-2

我想在Qt5 C++中使用TagLib庫(1.11.1)製作音樂播放器。我打開了多個文件並閱讀標籤。我遇到了兩個困難。打開文件並閱讀標籤後,我無法關閉文件並釋放文件佔用的內存。我使用delete來釋放內存並關閉文件。但是,當我嘗試這個程序崩潰。這裏是我的程序代碼剪斷:TagLib在破壞TagLib :: File時崩潰,無法關閉打開的TagLib :: File

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

+0

您可以在崩潰後給我們調試器輸出嗎? (堆棧溢出?訪問不良,堆腐蝕崩潰?) – Raxvan

+0

對不起@Raxvan ...這是我第一次發佈一個問題。我已經添加了調試結果。 –

回答

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 
     } 
    } 
} 
+0

謝謝@Evgeny,它解決了我所有的問題。我發現在我的代碼中,我手動刪除了一些標籤,導致程序崩潰。 –