2017-01-02 12 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; 
} 

Но то же самое происходит, когда Я оставляю функцию. Я немного тупой, потому что, если я не позабочусь об удалении фрейма, я создам для себя большую проблему. Если кто-нибудь может дать мне некоторое представление.

ответ

3

Из документации API TagLib:

аннулируются TagLib :: ID3v2 :: Tag :: ADDFRAME (Frame * кадр)

Добавить рамку к метке. На этом этапе тег получает право собственности на фрейм и будет обрабатывать освобождение его памяти.

Тег заботится об удалении рамки. Если вы сами удалите фрейм, вы получите двойное удаление, и если тег обратится к кадру перед удалением его в своем деструкторе, это также приведет к нарушению доступа.

+0

Спасибо, я посмотрел описание документов, но не функции. Спасибо, что расчистили меня за меня – adviner