2017-01-02 4 views
0

私はTaglibを使用しており、mp3にカバーアートを書いています。ここでは、次のコードは動作します:削除またはスマートポインタのエラー

bool MediaHelper::AddCoverArt(const QString &media, const QString &image_file) 
{ 
    TagLib::MPEG::File mpeg(media.toStdString().c_str()); 
    TagLib::ID3v2::Tag *id3v2Tag = mpeg.ID3v2Tag(true); 
    TagLib::ID3v2::AttachedPictureFrame *frame = new TagLib::ID3v2::AttachedPictureFrame; 
    frame->setMimeType("image/jpeg"); 
    frame->setPicture(image.data()); 
    id3v2Tag->addFrame(frame); 
    mpeg.save(); 
    delete frame; 
    return true; 
} 

が、私は、私はその後、QScopedPointerでそれを試してみました読み出しアクセス違反

でアプリがクラッシュする機能を残して一度:

bool MediaHelper::AddCoverArt(const QString &media, const QString &image_file) 
{ 
    TagLib::ID3v2::Tag *id3v2Tag = mpeg.ID3v2Tag(true); 
    QScopedPointer<TagLib::ID3v2::AttachedPictureFrame> frame(new TagLib::ID3v2::AttachedPictureFrame); 
    frame->setMimeType("image/jpeg"); 
    frame->setPicture(image.data()); 
    id3v2Tag->addFrame(frame.data()); 
    mpeg.save();  
    return true; 
} 

しかし、同じことは、いつ起こります私はその機能を残す。私はフレームを削除する気にしなければ私は自分のために大きな問題を作成するので、私はちょっと困っています。誰かが私にいくつかの洞察力を与えることができれば。 taglib APIドキュメントから

答えて

3

無効TagLibの:: ID3v2の::タグ:: ADDFRAME(フレーム*フレーム)

タグにフレームを追加します。この時点で、タグはフレーム の所有権を取り、そのメモリの解放を処理します。

このタグは、フレームの削除を処理します。自分自身もフレームを削除すると、ダブル・デリートで終了し、タグがデストラクタで削除する前にフレームにアクセスすると、アクセス違反にもなります。

+0

私はドキュメントの説明を見ましたが、機能は見ていませんでした。私のためにそれをクリアしていただきありがとうございます – adviner

関連する問題