2017-04-10 5 views
-2

Qt5 C++でTagLibライブラリ(1.11.1)を使用して音楽プレーヤーを作成しようとしています。私は複数のファイルを開いてタグを読んだ。そして私は2つの困難で遭遇しました。ファイルを開いてタグを読み取った後、ファイルを閉じずにファイルが占有していたメモリを解放することができませんでした。私はdeleteを使ってメモリを解放し、ファイルを閉じました。しかし、これを試すと、プログラムがクラッシュします。ここに私のプログラムのスニップコードは次のとおりです。TagLib :: Fileを破棄するときにTagLibがクラッシュし、開けなかった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

ありますか?

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を削除する必要はありません。私はdelete 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、それは私のすべての問題を解決しました。私は私のコードで手動でタグのいくつかを削除したことを発見し、それはプログラムのクラッシュにつながった。 –

関連する問題